1import * as agentcore from "@distilled.cloud/aws/bedrock-agentcore";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Binding from "../../Binding.ts";
5import { toWireSeconds } from "../../Util/Duration.ts";
6import { isBindingHost } from "../Lambda/Function.ts";
7import type { BrowserCustom } from "./BrowserCustom.ts";
8import {
9 StartBrowserSession,
10 type StartBrowserSessionRequest,
11} from "./StartBrowserSession.ts";
12
13// Bespoke (not the shared scaffold): converts the ergonomic `sessionTimeout`
14// Duration.Input to the wire `sessionTimeoutSeconds` field.
15export const StartBrowserSessionHttp = Layer.effect(
16 StartBrowserSession,
17 Effect.gen(function* () {
18 const startBrowserSession = yield* agentcore.startBrowserSession;
19
20 return Effect.fn(function* <R extends BrowserCustom>(browser: R) {
21 const Identifier = yield* browser.browserId;
22 if (!globalThis.__ALCHEMY_RUNTIME__) {
23 const host = yield* Binding.Host;
24 if (isBindingHost(host)) {
25 yield* host.bind`Allow(${host}, AWS.BedrockAgentCore.StartBrowserSession(${browser}))`(
26 {
27 policyStatements: [
28 {
29 Effect: "Allow",
30 Action: ["bedrock-agentcore:StartBrowserSession"],
31 Resource: [browser.browserArn],
32 },
33 ],
34 },
35 );
36 }
37 }
38 return Effect.fn(
39 `AWS.BedrockAgentCore.StartBrowserSession(${browser.LogicalId})`,
40 )(function* ({ sessionTimeout, ...request }: StartBrowserSessionRequest) {
41 return yield* startBrowserSession({
42 ...request,
43 sessionTimeoutSeconds: toWireSeconds(sessionTimeout),
44 browserIdentifier: yield* Identifier,
45 });
46 });
47 });
48 }),
49);