{"version":3,"sources":["../../src/types/chatbot/bedrock-lambda-error.ts","../../src/util/bedrock.ts"],"names":[],"mappings":";AAOO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AACzB,IAAA,KAAA,CAAM,OAAO,CAAA;AAAA,EACjB;AACJ,CAAA;;;ACEO,SAAS,kBAAA,CACZ,KAAA,EACA,KAAA,EACA,iBAAA,EACgC;AAChC,EAAA,IAAI,iBAAiB,kBAAA,EAAoB;AACrC,IAAA,OAAO,2BAAA,CAA4B,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,WAAA,EAAa,MAAM,cAAA,EAAgB,KAAA,CAAM,QAAA,IAAY,yBAAA,EAA2B,iBAAiB,CAAA;AAAA,EAC7J,CAAA,MAAO;AACH,IAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,IAAA,OAAO,2BAAA,CAA4B,YAAA,EAAc,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA,IAAY,yBAAA,EAA2B,iBAAA,EAAmB,IAAI,CAAA;AAAA,EAClK;AACJ;AAKO,IAAM,UAAA,GAAiD;AAAA,EAC1D,kBAAA,EAAoB,CAAC,CAAA,KAAc,CAAA;AAAA,EACnC,MAAA,EAAQ,CAAC,CAAA,KAAc,UAAA,CAAW,CAAC,CAAA;AAAA,EACnC,OAAA,EAAS,CAAC,CAAA,KAAc,CAAA,KAAM,MAAA;AAAA,EAC9B,OAAA,EAAS,CAAC,CAAA,KAAc,QAAA,CAAS,CAAC,CAAA;AAAA,EAClC,KAAA,EAAO,CAAC,CAAA,KAAc;AAClB,IAAA,IAAI;AAEA,MAAA,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AAYJ,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACtC,QAAA,MAAM,UAAU,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACpC,QAAA,IAAI,YAAY,EAAA,EAAI;AAChB,UAAA,OAAO,EAAC;AAAA,QACZ;AACA,QAAA,OAAO,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MACvD;AAEA,MAAA,OAAO,CAAC,CAAC,CAAA;AAAA,IACb;AAAA,EACJ;AACJ;AAOO,SAAS,kCAAkC,MAAA,EAA2C;AACzF,EAAA,OACI,MAAA,EAAQ,MAAA;AAAA,IACJ,CAAC,KAAK,KAAA,KAAU;AACZ,MAAA,GAAA,CAAI,MAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,IAAI,EAAE,KAAA,CAAM,KAAK,IAAI,UAAA,CAAW,kBAAA,CAAmB,MAAM,KAAK,CAAA;AAC1H,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAAA,IACA;AAAC,OACA,EAAC;AAEd;AAWO,SAAS,2BACZ,iBAAA,EACoE;AACpE,EAAA,IAAI,CAAC,iBAAA,IAAqB,MAAA,CAAO,KAAK,iBAAiB,CAAA,CAAE,WAAW,CAAA,EAAG;AACnE,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,OAAO,iBAAA;AACX;AAkBO,SAAS,4BACZ,IAAA,EACA,WAAA,EACA,cAAA,EACA,YAAA,EACA,mBACA,MAAA,EACgC;AAChC,EAAA,OAAO;AAAA,IACH,cAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACN,WAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,gBAAA,EAAkB;AAAA,QACd,GAAI,MAAA,GAAS,EAAE,aAAA,EAAe,SAAA,KAAc,EAAC;AAAA,QAC7C,YAAA,EAAc;AAAA,UACV,IAAA,EAAM;AAAA,YACF,MAAM,OAAO,IAAA,KAAS,WAAW,IAAA,GAAO,IAAA,CAAK,UAAU,IAAI;AAAA;AAC/D;AACJ;AACJ,KACJ;AAAA,IACA;AAAA,GACJ;AACJ","file":"bedrock.mjs","sourcesContent":["/**\n * This error is used to allow us to distinguish between errors that are\n * expected to be returned to the user and errors that are unexpected.\n *\n * These errors are caught in the Bedrock Lambda and converted into a\n * BedrockLambdaResponse object using the message as the body.\n */\nexport class BedrockLambdaError extends Error {\n    constructor(message: string) {\n        super(message);\n    }\n}\n","import { BedrockActionGroupLambdaEvent, BedrockActionGroupLambdaResponse, Parameter } from '../types/chatbot/bedrock';\nimport { BedrockLambdaError } from '../types/chatbot/bedrock-lambda-error';\nimport { RecordOrUndef, SessionDataWithChatUserCustomDataSpreadIn } from '../types/chatbot/chatbot-types';\n\n/**\n * Handles an error and returns a BedrockLambdaResponse object.\n *\n * If the error is an instance of BedrockLambdaError, it will be returned as is.\n * Otherwise, it will be converted to a string and returned as a BedrockLambdaError.\n *\n * @param error The error to handle.\n * @returns A BedrockLambdaResponse object.\n */\nexport function handleBedrockError(\n    error: unknown,\n    event: BedrockActionGroupLambdaEvent,\n    sessionAttributes?: SessionDataWithChatUserCustomDataSpreadIn<RecordOrUndef>\n): BedrockActionGroupLambdaResponse {\n    if (error instanceof BedrockLambdaError) {\n        return createBedrockLambdaResponse(error.message, event.actionGroup, event.messageVersion, event.function ?? 'NoFunctionNameSpecified', sessionAttributes);\n    } else {\n        console.error('Unexpected error:', error);\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        return createBedrockLambdaResponse(errorMessage, event.actionGroup, event.messageVersion, event.function ?? 'NoFunctionNameSpecified', sessionAttributes, true);\n    }\n}\n\n/**\n * Converter functions for Bedrock parameters.\n */\nexport const converters: Record<string, (v: string) => any> = {\n    defaultPassThrough: (v: string) => v,\n    number: (v: string) => parseFloat(v),\n    boolean: (v: string) => v === 'true',\n    integer: (v: string) => parseInt(v),\n    array: (v: string) => {\n        try {\n            // First try to parse as valid JSON\n            return JSON.parse(v);\n        } catch {\n            /* \n                TODO: is this a good idea?  Why did Bedrock give me a param that was invalid JSON for the array?\n\n                {\n                    \"name\": \"s3Keys\",\n                    \"type\": \"array\",\n                    \"value\": \"[uploads/2fbbf97a-070d-48ca-9d5e-fc9bcc88e570/019735c5-b0f0-7419-94d5-093b4202977a_sample-data.csv]\"\n                }\n            */\n            // If JSON.parse fails, try to handle array with unquoted strings\n            // Remove brackets and split by comma, then trim whitespace\n            if (v.startsWith('[') && v.endsWith(']')) {\n                const content = v.slice(1, -1).trim();\n                if (content === '') {\n                    return [];\n                }\n                return content.split(',').map((item) => item.trim());\n            }\n            // If it doesn't look like an array format, return as single-item array\n            return [v];\n        }\n    }\n};\n\n/**\n * Converts Bedrock parameters to the correct type.\n * @param params - The parameters to convert.\n * @returns A record of parameter names and their converted values.\n */\nexport function convertBedrockParamsToCorrectType(params?: Parameter[]): Record<string, any> {\n    return (\n        params?.reduce(\n            (acc, param) => {\n                acc[param.name] = converters[param.type] ? converters[param.type](param.value) : converters.defaultPassThrough(param.value);\n                return acc;\n            },\n            {} as Record<string, any>\n        ) ?? {}\n    );\n}\n\n/**\n * Normalizes the session attributes, converting the type to T.  An empty sessionAttributes object is the\n * same as undefined.\n *\n * Type T is the type of the session attributes.\n *\n * @param sessionAttributes The session attributes.\n * @returns The normalized session attributes.\n */\nexport function normalizeSessionAttributes(\n    sessionAttributes?: SessionDataWithChatUserCustomDataSpreadIn<RecordOrUndef>\n): SessionDataWithChatUserCustomDataSpreadIn<RecordOrUndef> | undefined {\n    if (!sessionAttributes || Object.keys(sessionAttributes).length === 0) {\n        return undefined;\n    }\n\n    return sessionAttributes;\n}\n\n/**\n * Creates a BedrockLambdaResponse object.\n *\n * Type T is the type of the session attributes.  By including the sessionAttributes\n * parameter, we are telling Bedrock to persist the session attributes for the\n * duration of the session and they will be passed in on all subsequent calls\n * using the event.sessionAttributes parameter.\n *\n * @param body The body of the response.\n * @param actionGroup The action group.\n * @param messageVersion The message version.\n * @param functionName The function name.\n * @param sessionAttributes The session attributes.\n * @param failed Whether the response is a failure.\n * @returns A BedrockLambdaResponse object.\n */\nexport function createBedrockLambdaResponse(\n    body: string | Record<string, any>,\n    actionGroup: string,\n    messageVersion: string,\n    functionName: string,\n    sessionAttributes?: SessionDataWithChatUserCustomDataSpreadIn<RecordOrUndef>,\n    failed?: boolean\n): BedrockActionGroupLambdaResponse {\n    return {\n        messageVersion,\n        response: {\n            actionGroup,\n            function: functionName,\n            functionResponse: {\n                ...(failed ? { responseState: 'FAILURE' } : {}),\n                responseBody: {\n                    TEXT: {\n                        body: typeof body === 'string' ? body : JSON.stringify(body)\n                    }\n                }\n            }\n        },\n        sessionAttributes\n    };\n}\n"]}