@effect-uai/core 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/{Image-BZmKfIdq.d.mts → Image-C4vuBmu0.d.mts} +11 -11
  2. package/dist/{Image-BZmKfIdq.d.mts.map → Image-C4vuBmu0.d.mts.map} +1 -1
  3. package/dist/{Items-BnIduEV2.d.mts → Items-BKQgqJ8A.d.mts} +136 -97
  4. package/dist/Items-BKQgqJ8A.d.mts.map +1 -0
  5. package/dist/{Tool-2lC_XMth.d.mts → Tool-u5bag8SO.d.mts} +42 -9
  6. package/dist/Tool-u5bag8SO.d.mts.map +1 -0
  7. package/dist/{ToolEvent-cWZ2BnbS.d.mts → ToolEvent-BBfOdhF_.d.mts} +2 -2
  8. package/dist/{ToolEvent-cWZ2BnbS.d.mts.map → ToolEvent-BBfOdhF_.d.mts.map} +1 -1
  9. package/dist/{ToolResult-CL4hK_9z.d.mts → ToolResult-CRpmkBXR.d.mts} +2 -2
  10. package/dist/{ToolResult-CL4hK_9z.d.mts.map → ToolResult-CRpmkBXR.d.mts.map} +1 -1
  11. package/dist/{Toolkit-Dr9l_hNy.d.mts → Toolkit-D4mQvhjq.d.mts} +6 -6
  12. package/dist/Toolkit-D4mQvhjq.d.mts.map +1 -0
  13. package/dist/browser/Browser.mjs +4 -4
  14. package/dist/browser/Browser.mjs.map +1 -1
  15. package/dist/browser/BrowserTool.d.mts +34 -33
  16. package/dist/browser/BrowserTool.d.mts.map +1 -1
  17. package/dist/{dist-DWgRbDN3.mjs → dist-C0m0QnUP.mjs} +71 -30
  18. package/dist/dist-C0m0QnUP.mjs.map +1 -0
  19. package/dist/{dist-B04dlFHg.mjs → dist-CcRV3-A5.mjs} +8 -8
  20. package/dist/{dist-B04dlFHg.mjs.map → dist-CcRV3-A5.mjs.map} +1 -1
  21. package/dist/domain/Citation.d.mts +60 -0
  22. package/dist/domain/Citation.d.mts.map +1 -0
  23. package/dist/domain/Citation.mjs +7 -0
  24. package/dist/domain/Citation.mjs.map +1 -0
  25. package/dist/domain/Image.d.mts +1 -1
  26. package/dist/domain/Items.d.mts +1 -1
  27. package/dist/domain/Items.mjs +28 -4
  28. package/dist/domain/Items.mjs.map +1 -1
  29. package/dist/domain/Research.d.mts +37 -0
  30. package/dist/domain/Research.d.mts.map +1 -0
  31. package/dist/domain/Research.mjs +7 -0
  32. package/dist/domain/Research.mjs.map +1 -0
  33. package/dist/domain/Turn.d.mts +92 -9
  34. package/dist/domain/Turn.d.mts.map +1 -1
  35. package/dist/domain/Turn.mjs +8 -1
  36. package/dist/domain/Turn.mjs.map +1 -1
  37. package/dist/domain/Turn.test.mjs +1 -1
  38. package/dist/embedding-model/Embedding.d.mts +1 -1
  39. package/dist/embedding-model/EmbeddingModel.mjs +2 -2
  40. package/dist/embedding-model/EmbeddingModel.mjs.map +1 -1
  41. package/dist/embedding-model/EmbeddingModel.test.mjs +1 -1
  42. package/dist/index.d.mts +12 -8
  43. package/dist/index.mjs +5 -1
  44. package/dist/job/Job.d.mts +80 -0
  45. package/dist/job/Job.d.mts.map +1 -0
  46. package/dist/job/Job.mjs +49 -0
  47. package/dist/job/Job.mjs.map +1 -0
  48. package/dist/language-model/LanguageModel.d.mts +2 -2
  49. package/dist/language-model/LanguageModel.mjs +2 -2
  50. package/dist/language-model/LanguageModel.mjs.map +1 -1
  51. package/dist/language-model/LanguageModel.test.mjs +1 -1
  52. package/dist/loop/Loop.test.mjs +1 -1
  53. package/dist/music-generator/MusicGenerator.mjs +4 -4
  54. package/dist/music-generator/MusicGenerator.mjs.map +1 -1
  55. package/dist/music-generator/MusicGenerator.test.mjs +1 -1
  56. package/dist/observability/Metrics.d.mts +13 -5
  57. package/dist/observability/Metrics.d.mts.map +1 -1
  58. package/dist/observability/Metrics.mjs +30 -7
  59. package/dist/observability/Metrics.mjs.map +1 -1
  60. package/dist/observability/Metrics.test.mjs +44 -2
  61. package/dist/observability/Metrics.test.mjs.map +1 -1
  62. package/dist/observability/Telemetry.test.mjs +2 -2
  63. package/dist/research/DeepResearch.d.mts +71 -0
  64. package/dist/research/DeepResearch.d.mts.map +1 -0
  65. package/dist/research/DeepResearch.mjs +61 -0
  66. package/dist/research/DeepResearch.mjs.map +1 -0
  67. package/dist/retry/Retry.d.mts +3 -3
  68. package/dist/retry/Retry.d.mts.map +1 -1
  69. package/dist/retry/Retry.mjs +30 -1
  70. package/dist/retry/Retry.mjs.map +1 -1
  71. package/dist/retry/Retry.test.mjs +1 -1
  72. package/dist/sandbox/Sandbox.mjs +18 -18
  73. package/dist/sandbox/Sandbox.mjs.map +1 -1
  74. package/dist/speech-synthesizer/SpeechSynthesizer.mjs +8 -8
  75. package/dist/speech-synthesizer/SpeechSynthesizer.mjs.map +1 -1
  76. package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs +1 -1
  77. package/dist/streaming/JSONL.d.mts +3 -1
  78. package/dist/streaming/JSONL.d.mts.map +1 -1
  79. package/dist/streaming/JSONL.mjs +5 -11
  80. package/dist/streaming/JSONL.mjs.map +1 -1
  81. package/dist/streaming/JSONL.test.mjs +10 -1
  82. package/dist/streaming/JSONL.test.mjs.map +1 -1
  83. package/dist/streaming/SSE.d.mts +5 -3
  84. package/dist/streaming/SSE.d.mts.map +1 -1
  85. package/dist/streaming/SSE.mjs +28 -38
  86. package/dist/streaming/SSE.mjs.map +1 -1
  87. package/dist/streaming/SSE.test.mjs +54 -4
  88. package/dist/streaming/SSE.test.mjs.map +1 -1
  89. package/dist/structured-format/StructuredFormat.test.mjs +1 -1
  90. package/dist/testing/MockProvider.d.mts +1 -1
  91. package/dist/testing/MockSandbox.d.mts +1 -1
  92. package/dist/tool/Approval.d.mts +3 -3
  93. package/dist/tool/Approval.test.mjs +1 -1
  94. package/dist/tool/HistoryCheck.d.mts +2 -2
  95. package/dist/tool/Tool.d.mts +2 -2
  96. package/dist/tool/Tool.mjs +27 -7
  97. package/dist/tool/Tool.mjs.map +1 -1
  98. package/dist/tool/Tool.test.mjs +127 -3
  99. package/dist/tool/Tool.test.mjs.map +1 -1
  100. package/dist/tool/ToolEvent.d.mts +1 -1
  101. package/dist/tool/ToolResult.d.mts +1 -1
  102. package/dist/tool/Toolkit.d.mts +1 -1
  103. package/dist/tool/Toolkit.mjs.map +1 -1
  104. package/dist/tool/Toolkit.test.mjs +46 -2
  105. package/dist/tool/Toolkit.test.mjs.map +1 -1
  106. package/dist/transcriber/Transcriber.mjs +3 -3
  107. package/dist/transcriber/Transcriber.mjs.map +1 -1
  108. package/dist/transcriber/Transcriber.test.mjs +1 -1
  109. package/dist/web-read/WebRead.mjs +1 -1
  110. package/dist/web-read/WebRead.mjs.map +1 -1
  111. package/dist/web-read/WebReadTool.d.mts +1 -1
  112. package/dist/web-search/WebSearch.mjs +1 -1
  113. package/dist/web-search/WebSearch.mjs.map +1 -1
  114. package/dist/web-search/WebSearchTool.d.mts +1 -1
  115. package/package.json +19 -3
  116. package/src/browser/Browser.ts +4 -4
  117. package/src/domain/Citation.ts +64 -0
  118. package/src/domain/Items.ts +32 -4
  119. package/src/domain/Research.ts +42 -0
  120. package/src/domain/Turn.ts +26 -0
  121. package/src/embedding-model/EmbeddingModel.ts +2 -2
  122. package/src/index.ts +4 -0
  123. package/src/job/Job.ts +125 -0
  124. package/src/language-model/LanguageModel.ts +2 -2
  125. package/src/music-generator/MusicGenerator.ts +4 -4
  126. package/src/observability/Metrics.test.ts +65 -0
  127. package/src/observability/Metrics.ts +53 -11
  128. package/src/research/DeepResearch.ts +137 -0
  129. package/src/retry/Retry.ts +44 -3
  130. package/src/sandbox/Sandbox.ts +18 -18
  131. package/src/speech-synthesizer/SpeechSynthesizer.ts +8 -8
  132. package/src/streaming/JSONL.test.ts +19 -0
  133. package/src/streaming/JSONL.ts +6 -38
  134. package/src/streaming/SSE.test.ts +86 -3
  135. package/src/streaming/SSE.ts +36 -80
  136. package/src/tool/Tool.test.ts +151 -1
  137. package/src/tool/Tool.ts +120 -22
  138. package/src/tool/Toolkit.test.ts +60 -0
  139. package/src/tool/Toolkit.ts +2 -2
  140. package/src/transcriber/Transcriber.ts +3 -3
  141. package/src/web-read/WebRead.ts +1 -1
  142. package/src/web-search/WebSearch.ts +1 -1
  143. package/dist/Items-BnIduEV2.d.mts.map +0 -1
  144. package/dist/Tool-2lC_XMth.d.mts.map +0 -1
  145. package/dist/Toolkit-Dr9l_hNy.d.mts.map +0 -1
  146. package/dist/dist-DWgRbDN3.mjs.map +0 -1
@@ -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.asEffect(), (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.asEffect(), (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.asEffect(), (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.asEffect(), (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,QAAQ,UAAU,GAAG,MAAM,EAAE,OAAO,QAAQ,CAAC;;;;;AAM9D,MAAa,UACX,OAEA,OAAO,QAAQ,QAAQ,UAAU,GAAG,MAAM,EAAE,OAAO,GAAG,CAAC;;AAGzD,MAAa,OAIT,OAAO,QAAQ,QAAQ,UAAU,GAAG,MAAM,EAAE,KAAK;;;;;AAMrD,MAAa,WACX,OAEA,OAAO,QAAQ,QAAQ,UAAU,GAAG,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,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,27 +1,28 @@
1
1
  import { BrowserError } from "./BrowserError.mjs";
2
2
  import { BrowserSession } from "./Browser.mjs";
3
- import { l as Tool } from "../Tool-2lC_XMth.mjs";
3
+ import { l as Tool } from "../Tool-u5bag8SO.mjs";
4
+ import { Schema } from "effect";
4
5
 
5
6
  //#region src/browser/BrowserTool.d.ts
6
7
  declare namespace BrowserTool_d_exports {
7
8
  export { browserToolkit, clickTool, fillTool, gotoTool, pressTool, scrollTool };
8
9
  }
9
- declare const gotoTool: (session: BrowserSession) => Tool<"browser_goto", {
10
- readonly url: string;
11
- }, unknown, string, BrowserError, never>;
12
- declare const clickTool: (session: BrowserSession) => Tool<"browser_click", {
13
- readonly ref: string;
14
- }, unknown, string, BrowserError, never>;
15
- declare const fillTool: (session: BrowserSession) => Tool<"browser_fill", {
16
- readonly ref: string;
17
- readonly text: string;
18
- }, unknown, string, BrowserError, never>;
19
- declare const pressTool: (session: BrowserSession) => Tool<"browser_press", {
20
- readonly key: string;
21
- }, unknown, string, BrowserError, never>;
22
- declare const scrollTool: (session: BrowserSession) => Tool<"browser_scroll", {
23
- readonly direction: "up" | "down";
24
- }, unknown, string, BrowserError, never>;
10
+ declare const gotoTool: (session: BrowserSession) => Tool<"browser_goto", Schema.Struct.ReadonlySide<{
11
+ readonly url: Schema.String;
12
+ }, "Type">, unknown, string, BrowserError, never>;
13
+ declare const clickTool: (session: BrowserSession) => Tool<"browser_click", Schema.Struct.ReadonlySide<{
14
+ readonly ref: Schema.String;
15
+ }, "Type">, unknown, string, BrowserError, never>;
16
+ declare const fillTool: (session: BrowserSession) => Tool<"browser_fill", Schema.Struct.ReadonlySide<{
17
+ readonly ref: Schema.String;
18
+ readonly text: Schema.String;
19
+ }, "Type">, unknown, string, BrowserError, never>;
20
+ declare const pressTool: (session: BrowserSession) => Tool<"browser_press", Schema.Struct.ReadonlySide<{
21
+ readonly key: Schema.String;
22
+ }, "Type">, unknown, string, BrowserError, never>;
23
+ declare const scrollTool: (session: BrowserSession) => Tool<"browser_scroll", Schema.Struct.ReadonlySide<{
24
+ readonly direction: Schema.Literals<readonly ["up", "down"]>;
25
+ }, "Type">, unknown, string, BrowserError, never>;
25
26
  /**
26
27
  * The canonical browser action verbs bundled as a `Toolkit`, closed over a
27
28
  * live `BrowserSession`. Compose it with a recipe-local page-reading tool and
@@ -36,22 +37,22 @@ declare const scrollTool: (session: BrowserSession) => Tool<"browser_scroll", {
36
37
  * constructors directly. Run a turn's calls with `{ concurrency: 1 }`.
37
38
  */
38
39
  declare const browserToolkit: (session: BrowserSession) => {
39
- browser_goto: Tool<"browser_goto", {
40
- readonly url: string;
41
- }, unknown, string, BrowserError, never>;
42
- browser_click: Tool<"browser_click", {
43
- readonly ref: string;
44
- }, unknown, string, BrowserError, never>;
45
- browser_fill: Tool<"browser_fill", {
46
- readonly ref: string;
47
- readonly text: string;
48
- }, unknown, string, BrowserError, never>;
49
- browser_press: Tool<"browser_press", {
50
- readonly key: string;
51
- }, unknown, string, BrowserError, never>;
52
- browser_scroll: Tool<"browser_scroll", {
53
- readonly direction: "up" | "down";
54
- }, unknown, string, BrowserError, never>;
40
+ browser_goto: Tool<"browser_goto", Schema.Struct.ReadonlySide<{
41
+ readonly url: Schema.String;
42
+ }, "Type">, unknown, string, BrowserError, never>;
43
+ browser_click: Tool<"browser_click", Schema.Struct.ReadonlySide<{
44
+ readonly ref: Schema.String;
45
+ }, "Type">, unknown, string, BrowserError, never>;
46
+ browser_fill: Tool<"browser_fill", Schema.Struct.ReadonlySide<{
47
+ readonly ref: Schema.String;
48
+ readonly text: Schema.String;
49
+ }, "Type">, unknown, string, BrowserError, never>;
50
+ browser_press: Tool<"browser_press", Schema.Struct.ReadonlySide<{
51
+ readonly key: Schema.String;
52
+ }, "Type">, unknown, string, BrowserError, never>;
53
+ browser_scroll: Tool<"browser_scroll", Schema.Struct.ReadonlySide<{
54
+ readonly direction: Schema.Literals<readonly ["up", "down"]>;
55
+ }, "Type">, unknown, string, BrowserError, never>;
55
56
  };
56
57
  //#endregion
57
58
  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":";;;;;;;;cAoEa,QAAA,GAAY,OAAA,EAAS,cAAA,KAAc,IAAA;EAAA;oBAAA,YAAA;AAAA,cAcnC,SAAA,GAAa,OAAA,EAAS,cAAA,KAAc,IAAA;EAAA;oBAAA,YAAA;AAAA,cAcpC,QAAA,GAAY,OAAA,EAAS,cAAA,KAAc,IAAA;EAAA;;oBAAA,YAAA;AAAA,cAenC,SAAA,GAAa,OAAA,EAAS,cAAA,KAAc,IAAA;EAAA;oBAAA,YAAA;AAAA,cAcpC,UAAA,GAAc,OAAA,EAAS,cAAA,KAAc,IAAA;EAAA;oBAAA,YAAA;;;;;;;;;;;;;AA3ClD;cAuEa,cAAA,GAAkB,OAAA,EAAS,cAAA;;;sBAAc,YAAA"}
1
+ {"version":3,"file":"BrowserTool.d.mts","names":[],"sources":["../../src/browser/BrowserTool.ts"],"mappings":";;;;;;;;;cAoEa,QAAA,GAAY,OAAA,EAAS,cAAA,KAAc,IAAA,iBAAA,MAAA,CAAA,MAAA,CAAA,YAAA;EAAA;6BAAA,YAAA;AAAA,cAcnC,SAAA,GAAa,OAAA,EAAS,cAAA,KAAc,IAAA,kBAAA,MAAA,CAAA,MAAA,CAAA,YAAA;EAAA;6BAAA,YAAA;AAAA,cAcpC,QAAA,GAAY,OAAA,EAAS,cAAA,KAAc,IAAA,iBAAA,MAAA,CAAA,MAAA,CAAA,YAAA;EAAA;;6BAAA,YAAA;AAAA,cAenC,SAAA,GAAa,OAAA,EAAS,cAAA,KAAc,IAAA,kBAAA,MAAA,CAAA,MAAA,CAAA,YAAA;EAAA;6BAAA,YAAA;AAAA,cAcpC,UAAA,GAAc,OAAA,EAAS,cAAA,KAAc,IAAA,mBAAA,MAAA,CAAA,MAAA,CAAA,YAAA;EAAA;6BAAA,YAAA;;;;;;;;;;;;;;cA4BrC,cAAA,GAAkB,OAAA,EAAS,cAAA"}
@@ -1,4 +1,4 @@
1
- import { a as describe, i as beforeAll, o as it$1, r as afterAll } from "./dist-B04dlFHg.mjs";
1
+ import { a as beforeEach, c as it$1, i as beforeAll, o as describe, r as afterAll, s as getCurrentSuite } from "./dist-CcRV3-A5.mjs";
2
2
  import * as Cause from "effect/Cause";
3
3
  import * as Duration from "effect/Duration";
4
4
  import * as Effect from "effect/Effect";
@@ -12,9 +12,9 @@ import * as Scope from "effect/Scope";
12
12
  import * as fc from "effect/testing/FastCheck";
13
13
  import * as TestClock from "effect/testing/TestClock";
14
14
  import * as TestConsole from "effect/testing/TestConsole";
15
- //#region ../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.66_effect@4.0.0-beta.57_vitest@4.1.5_@types+node@25.6.0_vite@_d7d7dab69e8c36d4c2ec9ca466208ed9/node_modules/@effect/vitest/dist/internal/internal.js
15
+ //#region ../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.94_effect@4.0.0-beta.94_vitest@4.1.5_@types+node@25.6.0_vite@_d376dad414e93cb5624154e275002f20/node_modules/@effect/vitest/dist/internal/internal.js
16
16
  /**
17
- * @since 1.0.0
17
+ * @since 4.0.0
18
18
  */
19
19
  const runPromise = /* @__PURE__ */ Effect.fnUntraced(function* (effect, _ctx) {
20
20
  const exit = yield* Effect.exit(effect);
@@ -29,6 +29,25 @@ const runTest = (ctx) => (effect) => runPromise(effect, ctx);
29
29
  const TestEnv = /* @__PURE__ */ Layer.mergeAll(TestConsole.layer, /* @__PURE__ */ TestClock.layer());
30
30
  /** @internal */
31
31
  const testOptions = (timeout) => typeof timeout === "number" ? { timeout } : timeout ?? {};
32
+ const hookTimeout = (timeout) => timeout === void 0 ? void 0 : Duration.toMillis(Duration.fromInputUnsafe(timeout));
33
+ const makeItProxy = (it, overrides) => new Proxy(it, {
34
+ apply(target, thisArg, argArray) {
35
+ return Reflect.apply(target, thisArg, argArray);
36
+ },
37
+ get(target, property, receiver) {
38
+ if (property in overrides) return Reflect.get(overrides, property);
39
+ const value = Reflect.get(target, property, receiver);
40
+ return typeof value === "function" ? value.bind(target) : value;
41
+ }
42
+ });
43
+ const collectTasks = (tasks, acc = []) => {
44
+ for (let i = 0; i < tasks.length; i++) {
45
+ const task = tasks[i];
46
+ if (task.type === "test" && task.mode !== "skip" && task.mode !== "todo") acc.push(task);
47
+ else if (task.tasks !== void 0) collectTasks(task.tasks, acc);
48
+ }
49
+ return acc;
50
+ };
32
51
  /** @internal */
33
52
  const makeTester = (mapEffect, it = it$1) => {
34
53
  const run = (ctx, args, self) => pipe(Effect.suspend(() => self(...args)), mapEffect, runTest(ctx));
@@ -66,7 +85,7 @@ const makeTester = (mapEffect, it = it$1) => {
66
85
  });
67
86
  };
68
87
  /** @internal */
69
- const prop$1 = (name, arbitraries, self, timeout) => {
88
+ const prop = (name, arbitraries, self, timeout) => {
70
89
  if (Array.isArray(arbitraries)) {
71
90
  const arbs = arbitraries.map((arbitrary) => {
72
91
  if (Schema.isSchema(arbitrary)) throw new Error("Schemas are not supported yet");
@@ -83,58 +102,80 @@ const prop$1 = (name, arbitraries, self, timeout) => {
83
102
  return it$1(name, testOptions(timeout), (ctx) => fc.assert(fc.property(arbs, (as) => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));
84
103
  };
85
104
  /** @internal */
86
- const layer$1 = (layer_, options) => (...args) => {
105
+ const layer = (layer_, options) => (...args) => {
87
106
  const excludeTestServices = options?.excludeTestServices ?? false;
88
107
  const withTestEnv = excludeTestServices ? layer_ : Layer.provideMerge(layer_, TestEnv);
89
108
  const memoMap = options?.memoMap ?? Effect.runSync(Layer.makeMemoMap);
90
109
  const scope = Effect.runSync(Scope.make());
91
110
  const contextEffect = Layer.buildWithMemoMap(withTestEnv, memoMap, scope).pipe(Effect.orDie, Effect.cached, Effect.runSync);
92
- const makeIt = (it) => Object.assign(it, {
111
+ let closed = false;
112
+ const closeScope = (ctx) => {
113
+ if (closed) return Promise.resolve();
114
+ closed = true;
115
+ return runPromise(Scope.close(scope, Exit.void), ctx);
116
+ };
117
+ const makeIt = (it) => makeItProxy(it, {
93
118
  effect: makeTester((effect) => Effect.flatMap(contextEffect, (context) => effect.pipe(Effect.scoped, Effect.provide(context))), it),
94
- prop: prop$1,
95
- flakyTest: flakyTest$1,
119
+ prop,
120
+ flakyTest,
96
121
  layer(nestedLayer, options) {
97
- return layer$1(Layer.provideMerge(nestedLayer, withTestEnv), {
122
+ return layer(Layer.provideMerge(nestedLayer, withTestEnv), {
98
123
  ...options,
99
- memoMap,
124
+ memoMap: Layer.forkMemoMapUnsafe(memoMap),
100
125
  excludeTestServices
101
126
  });
102
127
  }
103
128
  });
104
129
  if (args.length === 1) {
105
- beforeAll(() => runPromise(Effect.asVoid(contextEffect)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
106
- afterAll(() => runPromise(Scope.close(scope, Exit.void)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
107
- return args[0](makeIt(it$1));
130
+ const currentSuite = getCurrentSuite();
131
+ const previousTasks = new Set(currentSuite.tasks);
132
+ args[0](makeIt(it$1));
133
+ const blockTasks = collectTasks(currentSuite.tasks.filter((task) => !previousTasks.has(task)));
134
+ if (blockTasks.length === 0) {
135
+ afterAll(() => closeScope(), hookTimeout(options?.timeout));
136
+ return;
137
+ }
138
+ const blockTaskSet = new Set(blockTasks);
139
+ let remaining = blockTasks.length;
140
+ beforeEach((ctx) => {
141
+ if (!blockTaskSet.has(ctx.task)) return;
142
+ ctx.onTestFinished(() => {
143
+ remaining--;
144
+ if (remaining === 0) return closeScope(ctx);
145
+ });
146
+ return runPromise(Effect.asVoid(contextEffect), ctx);
147
+ }, hookTimeout(options?.timeout));
148
+ afterAll(() => closeScope(), hookTimeout(options?.timeout));
149
+ return;
108
150
  }
109
151
  return describe(args[0], () => {
110
- beforeAll(() => runPromise(Effect.asVoid(contextEffect)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
111
- afterAll(() => runPromise(Scope.close(scope, Exit.void)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
152
+ beforeAll(() => runPromise(Effect.asVoid(contextEffect)), hookTimeout(options?.timeout));
153
+ afterAll(() => closeScope(), hookTimeout(options?.timeout));
112
154
  return args[1](makeIt(it$1));
113
155
  });
114
156
  };
115
157
  /** @internal */
116
- const flakyTest$1 = (self, timeout = Duration.seconds(30)) => pipe(self, Effect.scoped, Effect.sandbox, Effect.retry(pipe(Schedule.recurs(10), Schedule.while((_) => Effect.succeed(Duration.isLessThanOrEqualTo(Duration.fromInputUnsafe(_.elapsed), Duration.fromInputUnsafe(timeout)))))), Effect.orDie);
158
+ const flakyTest = (self, timeout = Duration.seconds(30)) => pipe(self, Effect.scoped, Effect.sandbox, Effect.retry(pipe(Schedule.recurs(10), Schedule.while((_) => Effect.succeed(Duration.isLessThanOrEqualTo(Duration.fromInputUnsafe(_.elapsed), Duration.fromInputUnsafe(timeout)))))), Effect.orDie);
117
159
  /** @internal */
118
- const makeMethods = (it) => Object.assign(it, {
160
+ const makeMethods = (it) => makeItProxy(it, {
119
161
  effect: makeTester(flow(Effect.scoped, Effect.provide(TestEnv)), it),
120
162
  live: makeTester(Effect.scoped, it),
121
- flakyTest: flakyTest$1,
122
- layer: layer$1,
123
- prop: prop$1
163
+ flakyTest,
164
+ layer,
165
+ prop
124
166
  });
125
167
  /** @internal */
126
- const { effect: effect$1, live: live$1 } = /* @__PURE__ */ makeMethods(it$1);
168
+ const { effect, live } = /* @__PURE__ */ makeMethods(it$1);
169
+ //#endregion
170
+ //#region ../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.94_effect@4.0.0-beta.94_vitest@4.1.5_@types+node@25.6.0_vite@_d376dad414e93cb5624154e275002f20/node_modules/@effect/vitest/dist/index.js
127
171
  /**
128
- * @since 1.0.0
172
+ * @since 4.0.0
129
173
  */
130
- const it = /* @__PURE__ */ Object.assign(it$1, {
131
- effect: effect$1,
132
- live: live$1,
133
- flakyTest: flakyTest$1,
134
- layer: layer$1,
135
- prop: prop$1
136
- });
174
+ /**
175
+ * @since 4.0.0
176
+ */
177
+ const it = /* @__PURE__ */ makeMethods(it$1);
137
178
  //#endregion
138
179
  export { it as t };
139
180
 
140
- //# sourceMappingURL=dist-DWgRbDN3.mjs.map
181
+ //# sourceMappingURL=dist-C0m0QnUP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-C0m0QnUP.mjs","names":["V.it","V.describe","V.it"],"sources":["../../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.94_effect@4.0.0-beta.94_vitest@4.1.5_@types+node@25.6.0_vite@_d376dad414e93cb5624154e275002f20/node_modules/@effect/vitest/dist/internal/internal.js","../../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.94_effect@4.0.0-beta.94_vitest@4.1.5_@types+node@25.6.0_vite@_d376dad414e93cb5624154e275002f20/node_modules/@effect/vitest/dist/index.js"],"sourcesContent":["/**\n * @since 4.0.0\n */\nimport { getCurrentSuite } from \"@vitest/runner\";\nimport * as Cause from \"effect/Cause\";\nimport * as Duration from \"effect/Duration\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport { flow, pipe } from \"effect/Function\";\nimport * as Layer from \"effect/Layer\";\nimport { isObject } from \"effect/Predicate\";\nimport * as Schedule from \"effect/Schedule\";\nimport * as Schema from \"effect/Schema\";\nimport * as Scope from \"effect/Scope\";\nimport * as fc from \"effect/testing/FastCheck\";\nimport * as TestClock from \"effect/testing/TestClock\";\nimport * as TestConsole from \"effect/testing/TestConsole\";\nimport * as V from \"vitest\";\nconst runPromise = /*#__PURE__*/Effect.fnUntraced(function* (effect, _ctx) {\n const exit = yield* Effect.exit(effect);\n if (Exit.isFailure(exit)) {\n const errors = Cause.prettyErrors(exit.cause);\n for (let i = 0; i < errors.length; i++) {\n yield* Effect.logError(errors[i]);\n }\n }\n return yield* exit;\n}, (effect, _, ctx) => Effect.runPromise(effect, {\n signal: ctx?.signal\n}));\n/** @internal */\nconst runTest = ctx => effect => runPromise(effect, ctx);\nconst TestEnv = /*#__PURE__*/Layer.mergeAll(TestConsole.layer, /*#__PURE__*/TestClock.layer());\n/** @internal */\nexport const addEqualityTesters = () => {\n V.expect.addEqualityTesters([]);\n};\n/** @internal */\nconst testOptions = timeout => typeof timeout === \"number\" ? {\n timeout\n} : timeout ?? {};\nconst hookTimeout = timeout => timeout === undefined ? undefined : Duration.toMillis(Duration.fromInputUnsafe(timeout));\nconst makeItProxy = (it, overrides) => new Proxy(it, {\n apply(target, thisArg, argArray) {\n return Reflect.apply(target, thisArg, argArray);\n },\n get(target, property, receiver) {\n if (property in overrides) {\n return Reflect.get(overrides, property);\n }\n const value = Reflect.get(target, property, receiver);\n return typeof value === \"function\" ? value.bind(target) : value;\n }\n});\nconst collectTasks = (tasks, acc = []) => {\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n if (task.type === \"test\" && task.mode !== \"skip\" && task.mode !== \"todo\") {\n acc.push(task);\n } else if (task.tasks !== undefined) {\n collectTasks(task.tasks, acc);\n }\n }\n return acc;\n};\n/** @internal */\nconst makeTester = (mapEffect, it = V.it) => {\n const run = (ctx, args, self) => pipe(Effect.suspend(() => self(...args)), mapEffect, runTest(ctx));\n const f = (name, self, timeout) => it(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const skip = (name, self, timeout) => it.skip(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const skipIf = condition => (name, self, timeout) => it.skipIf(condition)(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const runIf = condition => (name, self, timeout) => it.runIf(condition)(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const only = (name, self, timeout) => it.only(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const each = cases => (name, self, timeout) => it.for(cases)(name, testOptions(timeout), (args, ctx) => run(ctx, [args], self));\n const fails = (name, self, timeout) => V.it.fails(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const prop = (name, arbitraries, self, timeout) => {\n if (Array.isArray(arbitraries)) {\n const arbs = arbitraries.map(arbitrary => {\n if (Schema.isSchema(arbitrary)) {\n return Schema.toArbitrary(arbitrary);\n }\n return arbitrary;\n });\n return it(name, testOptions(timeout), ctx =>\n // @ts-ignore\n fc.assert(\n // @ts-ignore\n fc.asyncProperty(...arbs, (...as) => run(ctx, [as, ctx], self)),\n // @ts-ignore\n isObject(timeout) ? timeout?.fastCheck : {}));\n }\n const arbs = fc.record(Object.keys(arbitraries).reduce(function (result, key) {\n const arb = arbitraries[key];\n if (Schema.isSchema(arb)) {\n result[key] = Schema.toArbitrary(arb);\n }\n result[key] = arb;\n return result;\n }, {}));\n return it(name, testOptions(timeout), ctx =>\n // @ts-ignore\n fc.assert(fc.asyncProperty(arbs, (...as) =>\n // @ts-ignore\n run(ctx, [as[0], ctx], self)),\n // @ts-ignore\n isObject(timeout) ? timeout?.fastCheck : {}));\n };\n return Object.assign(f, {\n skip,\n skipIf,\n runIf,\n only,\n each,\n fails,\n prop\n });\n};\n/** @internal */\nexport const prop = (name, arbitraries, self, timeout) => {\n if (Array.isArray(arbitraries)) {\n const arbs = arbitraries.map(arbitrary => {\n if (Schema.isSchema(arbitrary)) {\n throw new Error(\"Schemas are not supported yet\");\n }\n return arbitrary;\n });\n return V.it(name, testOptions(timeout),\n // @ts-ignore\n ctx => fc.assert(fc.property(...arbs, (...as) => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));\n }\n const arbs = fc.record(Object.keys(arbitraries).reduce(function (result, key) {\n const arb = arbitraries[key];\n if (Schema.isSchema(arb)) {\n throw new Error(\"Schemas are not supported yet\");\n }\n result[key] = arb;\n return result;\n }, {}));\n return V.it(name, testOptions(timeout),\n // @ts-ignore\n ctx => fc.assert(fc.property(arbs, as => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));\n};\n/** @internal */\nexport const layer = (layer_, options) => (...args) => {\n const excludeTestServices = options?.excludeTestServices ?? false;\n const withTestEnv = excludeTestServices ? layer_ : Layer.provideMerge(layer_, TestEnv);\n const memoMap = options?.memoMap ?? Effect.runSync(Layer.makeMemoMap);\n const scope = Effect.runSync(Scope.make());\n const contextEffect = Layer.buildWithMemoMap(withTestEnv, memoMap, scope).pipe(Effect.orDie, Effect.cached, Effect.runSync);\n let closed = false;\n const closeScope = ctx => {\n if (closed) {\n return Promise.resolve();\n }\n closed = true;\n return runPromise(Scope.close(scope, Exit.void), ctx);\n };\n const makeIt = it => makeItProxy(it, {\n effect: makeTester(effect => Effect.flatMap(contextEffect, context => effect.pipe(Effect.scoped, Effect.provide(context))), it),\n prop,\n flakyTest,\n layer(nestedLayer, options) {\n return layer(Layer.provideMerge(nestedLayer, withTestEnv), {\n ...options,\n memoMap: Layer.forkMemoMapUnsafe(memoMap),\n excludeTestServices\n });\n }\n });\n if (args.length === 1) {\n const currentSuite = getCurrentSuite();\n const previousTasks = new Set(currentSuite.tasks);\n args[0](makeIt(V.it));\n const blockTasks = collectTasks(currentSuite.tasks.filter(task => !previousTasks.has(task)));\n if (blockTasks.length === 0) {\n V.afterAll(() => closeScope(), hookTimeout(options?.timeout));\n return;\n }\n const blockTaskSet = new Set(blockTasks);\n let remaining = blockTasks.length;\n V.beforeEach(ctx => {\n if (!blockTaskSet.has(ctx.task)) {\n return;\n }\n ctx.onTestFinished(() => {\n remaining--;\n if (remaining === 0) {\n return closeScope(ctx);\n }\n });\n return runPromise(Effect.asVoid(contextEffect), ctx);\n }, hookTimeout(options?.timeout));\n V.afterAll(() => closeScope(), hookTimeout(options?.timeout));\n return;\n }\n return V.describe(args[0], () => {\n V.beforeAll(() => runPromise(Effect.asVoid(contextEffect)), hookTimeout(options?.timeout));\n V.afterAll(() => closeScope(), hookTimeout(options?.timeout));\n return args[1](makeIt(V.it));\n });\n};\n/** @internal */\nexport const flakyTest = (self, timeout = Duration.seconds(30)) => pipe(self, Effect.scoped, Effect.sandbox, Effect.retry(pipe(Schedule.recurs(10), Schedule.while(_ => Effect.succeed(Duration.isLessThanOrEqualTo(Duration.fromInputUnsafe(_.elapsed), Duration.fromInputUnsafe(timeout)))))), Effect.orDie);\n/** @internal */\nexport const makeMethods = it => makeItProxy(it, {\n effect: makeTester(flow(Effect.scoped, Effect.provide(TestEnv)), it),\n live: makeTester(Effect.scoped, it),\n flakyTest,\n layer,\n prop\n});\n/** @internal */\nexport const {\n /** @internal */\n effect,\n /** @internal */\n live\n} = /*#__PURE__*/makeMethods(V.it);\n/** @internal */\nexport const describeWrapped = (name, f) => V.describe(name, it => f(makeMethods(it)));\n//# sourceMappingURL=internal.js.map","import * as V from \"vitest\";\nimport * as internal from \"./internal/internal.js\";\n/**\n * @since 4.0.0\n */\nexport * from \"vitest\";\n/**\n * @since 4.0.0\n */\nexport const addEqualityTesters = internal.addEqualityTesters;\n/**\n * @since 4.0.0\n */\nexport const effect = internal.effect;\n/**\n * @since 4.0.0\n */\nexport const live = internal.live;\n/**\n * Share a `Layer` between multiple tests, optionally wrapping\n * the tests in a `describe` block if a name is provided.\n *\n * @since 4.0.0\n *\n * ```ts\n * import { expect, layer } from \"@effect/vitest\"\n * import { Effect, Layer, Context } from \"effect\"\n *\n * class Foo extends Context.Service(\"Foo\")<Foo, \"foo\">() {\n * static Live = Layer.succeed(Foo, \"foo\")\n * }\n *\n * class Bar extends Context.Service(\"Bar\")<Bar, \"bar\">() {\n * static Live = Layer.effect(\n * Bar,\n * Effect.map(Foo, () => \"bar\" as const)\n * )\n * }\n *\n * layer(Foo.Live)(\"layer\", (it) => {\n * it.effect(\"adds context\", () =>\n * Effect.gen(function*() {\n * const foo = yield* Foo\n * expect(foo).toEqual(\"foo\")\n * }))\n *\n * it.layer(Bar.Live)(\"nested\", (it) => {\n * it.effect(\"adds context\", () =>\n * Effect.gen(function*() {\n * const foo = yield* Foo\n * const bar = yield* Bar\n * expect(foo).toEqual(\"foo\")\n * expect(bar).toEqual(\"bar\")\n * }))\n * })\n * })\n * ```\n */\nexport const layer = internal.layer;\n/**\n * @since 4.0.0\n */\nexport const flakyTest = internal.flakyTest;\n/**\n * @since 4.0.0\n */\nexport const prop = internal.prop;\n/**\n * @since 4.0.0\n */\n/**\n * @since 4.0.0\n */\nexport const it = /*#__PURE__*/internal.makeMethods(V.it);\n/**\n * @since 4.0.0\n */\nexport const makeMethods = internal.makeMethods;\n/**\n * @since 4.0.0\n */\nexport const describeWrapped = internal.describeWrapped;\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -5107,7 +5107,7 @@ function manageArtifactAttachment(attachment) {
5107
5107
  if (attachment.body != null) attachment.bodyEncoding ??= "base64";
5108
5108
  }
5109
5109
  //#endregion
5110
- //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.8.3_/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js
5110
+ //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.9.0_/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js
5111
5111
  const NAME_WORKER_STATE = "__vitest_worker__";
5112
5112
  function getWorkerState() {
5113
5113
  const workerState = globalThis[NAME_WORKER_STATE];
@@ -9986,10 +9986,10 @@ function offsetToLineNumber(source, offset) {
9986
9986
  return line + 1;
9987
9987
  }
9988
9988
  //#endregion
9989
- //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.8.3_/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
9989
+ //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.9.0_/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
9990
9990
  var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
9991
9991
  //#endregion
9992
- //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.8.3_/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js
9992
+ //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.9.0_/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js
9993
9993
  const RealDate = Date;
9994
9994
  let now = null;
9995
9995
  var MockDate = class MockDate extends RealDate {
@@ -10952,7 +10952,7 @@ function raceWith(promise, other) {
10952
10952
  }))]);
10953
10953
  }
10954
10954
  //#endregion
10955
- //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.8.3_/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js
10955
+ //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.9.0_/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js
10956
10956
  var fakeTimersSrc = {};
10957
10957
  var global$1;
10958
10958
  var hasRequiredGlobal;
@@ -13629,7 +13629,7 @@ Object.defineProperty(globalThis, GLOBAL_EXPECT, {
13629
13629
  configurable: true
13630
13630
  });
13631
13631
  //#endregion
13632
- //#region ../../node_modules/.pnpm/vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.8.3/node_modules/vite/dist/node/module-runner.js
13632
+ //#region ../../node_modules/.pnpm/vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.9.0/node_modules/vite/dist/node/module-runner.js
13633
13633
  let SOURCEMAPPING_URL = "sourceMa";
13634
13634
  SOURCEMAPPING_URL += "ppingURL";
13635
13635
  typeof process < "u" && process.platform;
@@ -13677,7 +13677,7 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports) => {
13677
13677
  Object.defineProperty(exports, "__esModule", { value: true });
13678
13678
  }));
13679
13679
  //#endregion
13680
- //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.8.3_/node_modules/vitest/dist/index.js
13680
+ //#region ../../node_modules/.pnpm/vitest@4.1.5_@types+node@25.6.0_vite@7.3.2_@types+node@25.6.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.21.0_yaml@2.9.0_/node_modules/vitest/dist/index.js
13681
13681
  var import_dist = (/* @__PURE__ */ __commonJSMin(((exports) => {
13682
13682
  var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
13683
13683
  if (k2 === void 0) k2 = k;
@@ -13777,6 +13777,6 @@ var import_dist = (/* @__PURE__ */ __commonJSMin(((exports) => {
13777
13777
  exports.expectTypeOf = expectTypeOf;
13778
13778
  })))();
13779
13779
  //#endregion
13780
- export { describe as a, beforeAll as i, globalExpect as n, it as o, afterAll as r, import_dist as t };
13780
+ export { beforeEach as a, it as c, beforeAll as i, globalExpect as n, describe as o, afterAll as r, getCurrentSuite as s, import_dist as t };
13781
13781
 
13782
- //# sourceMappingURL=dist-B04dlFHg.mjs.map
13782
+ //# sourceMappingURL=dist-CcRV3-A5.mjs.map