quidproquo-actionprocessor-awslambda 0.0.263 → 0.1.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.
Files changed (308) hide show
  1. package/lib/commonjs/awsNamingUtils.d.ts +1 -0
  2. package/lib/commonjs/awsNamingUtils.js +12 -1
  3. package/lib/commonjs/getActionProcessor/core/ai/aiModelMap.js +9 -9
  4. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js +8 -41
  5. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +14 -50
  6. package/lib/commonjs/getActionProcessor/core/ai/logic/aiStreamPartMappers.d.ts +6 -0
  7. package/lib/commonjs/getActionProcessor/core/ai/logic/aiStreamPartMappers.js +57 -0
  8. package/lib/commonjs/getActionProcessor/core/ai/logic/index.d.ts +32 -0
  9. package/lib/commonjs/getActionProcessor/core/ai/logic/index.js +48 -0
  10. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamAbort.d.ts +3 -0
  11. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamAbort.js +9 -0
  12. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamCustom.d.ts +3 -0
  13. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamCustom.js +9 -0
  14. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamError.d.ts +3 -0
  15. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamError.js +10 -0
  16. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFilePart.d.ts +3 -0
  17. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFilePart.js +12 -0
  18. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinish.d.ts +3 -0
  19. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinish.js +11 -0
  20. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.d.ts +3 -0
  21. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js +11 -0
  22. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamPart.d.ts +3 -0
  23. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamPart.js +9 -0
  24. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamRaw.d.ts +2 -0
  25. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamRaw.js +8 -0
  26. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningDelta.d.ts +3 -0
  27. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningDelta.js +10 -0
  28. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningEnd.d.ts +3 -0
  29. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningEnd.js +9 -0
  30. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningFilePart.d.ts +3 -0
  31. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningFilePart.js +12 -0
  32. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningStart.d.ts +3 -0
  33. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamReasoningStart.js +9 -0
  34. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamSourcePart.d.ts +3 -0
  35. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamSourcePart.js +16 -0
  36. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamStart.d.ts +2 -0
  37. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamStart.js +8 -0
  38. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamStartStep.d.ts +2 -0
  39. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamStartStep.js +8 -0
  40. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamTextDelta.d.ts +3 -0
  41. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamTextDelta.js +10 -0
  42. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamTextEnd.d.ts +3 -0
  43. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamTextEnd.js +9 -0
  44. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamTextStart.d.ts +3 -0
  45. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamTextStart.js +9 -0
  46. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalRequest.d.ts +3 -0
  47. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalRequest.js +12 -0
  48. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalResponse.d.ts +3 -0
  49. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalResponse.js +13 -0
  50. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolCall.d.ts +3 -0
  51. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolCall.js +11 -0
  52. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolError.d.ts +3 -0
  53. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolError.js +13 -0
  54. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolInputDelta.d.ts +3 -0
  55. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolInputDelta.js +10 -0
  56. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolInputEnd.d.ts +3 -0
  57. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolInputEnd.js +9 -0
  58. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolInputStart.d.ts +3 -0
  59. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolInputStart.js +10 -0
  60. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolOutputDenied.d.ts +3 -0
  61. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolOutputDenied.js +10 -0
  62. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolResult.d.ts +3 -0
  63. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamToolResult.js +12 -0
  64. package/lib/commonjs/getActionProcessor/core/ai/logic/prepareAiPromptCall.d.ts +19 -0
  65. package/lib/commonjs/getActionProcessor/core/ai/logic/prepareAiPromptCall.js +53 -0
  66. package/lib/commonjs/getActionProcessor/core/ai/logic/toAiStreamUsage.d.ts +6 -0
  67. package/lib/commonjs/getActionProcessor/core/ai/logic/toAiStreamUsage.js +9 -0
  68. package/lib/commonjs/getActionProcessor/core/ai/logic/toErrorMessage.d.ts +1 -0
  69. package/lib/commonjs/getActionProcessor/core/ai/logic/toErrorMessage.js +11 -0
  70. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.d.ts +3 -0
  71. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.js +82 -0
  72. package/lib/commonjs/getActionProcessor/core/ai/types/aiSdkStreamPart.d.ts +5 -0
  73. package/lib/commonjs/getActionProcessor/core/ai/types/aiSdkStreamPart.js +2 -0
  74. package/lib/commonjs/getActionProcessor/core/ai/types/index.d.ts +1 -0
  75. package/lib/commonjs/{logic/textract → getActionProcessor/core/ai/types}/index.js +1 -2
  76. package/lib/commonjs/getActionProcessor/core/apiKeyValidation/getApiKeyValidationValidateActionProcessor.js +13 -2
  77. package/lib/commonjs/getActionProcessor/core/config/getConfigGetSecretActionProcessor.js +10 -2
  78. package/lib/commonjs/getActionProcessor/core/config/getConfigSetParameterActionProcessor.js +10 -2
  79. package/lib/commonjs/getActionProcessor/core/config/index.js +1 -2
  80. package/lib/commonjs/getActionProcessor/core/eventBus/getEventBusSendMessagesActionProcessor.js +15 -5
  81. package/lib/commonjs/getActionProcessor/core/file/getFileDeleteActionProcessor.js +17 -9
  82. package/lib/commonjs/getActionProcessor/core/file/getFileExistsActionProcessor.js +9 -1
  83. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js +5 -0
  84. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js +5 -0
  85. package/lib/commonjs/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js +13 -2
  86. package/lib/commonjs/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js +16 -7
  87. package/lib/commonjs/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js +11 -2
  88. package/lib/commonjs/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js +7 -2
  89. package/lib/commonjs/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js +11 -2
  90. package/lib/commonjs/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js +11 -2
  91. package/lib/commonjs/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js +11 -2
  92. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js +10 -2
  93. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js +10 -2
  94. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js +10 -2
  95. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +10 -2
  96. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js +12 -3
  97. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js +10 -2
  98. package/lib/commonjs/getActionProcessor/core/queue/getQueueSendMessageActionProcessor.js +16 -6
  99. package/lib/commonjs/getActionProcessor/core/system/getSystemExecuteStoryActionProcessor.js +5 -4
  100. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryAssociateSoftwareTokenActionProcessor.d.ts +2 -0
  101. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryAssociateSoftwareTokenActionProcessor.js +28 -0
  102. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryChangePasswordActionProcessor.js +11 -2
  103. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryConfirmEmailVerificationActionProcessor.js +11 -2
  104. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryConfirmForgotPasswordActionProcessor.js +12 -2
  105. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryCreateUserActionProcessor.js +12 -3
  106. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryDecodeAccessTokenActionProcessor.js +1 -1
  107. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryForgotPasswordActionProcessor.js +10 -2
  108. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryGetUserAttributesByUserIdActionProcessor.js +9 -2
  109. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryGetUsersActionProcessor.js +10 -2
  110. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryGetUsersByAttributeActionProcessor.js +10 -2
  111. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRefreshTokenActionProcessor.js +17 -3
  112. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js +11 -2
  113. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRespondToAuthChallengeActionProcessor.js +34 -2
  114. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectorySetPasswordActionProcessor.js +12 -2
  115. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectorySetUserAttributesActionProcessor.js +13 -2
  116. package/lib/commonjs/getActionProcessor/core/userDirectory/index.js +2 -1
  117. package/lib/commonjs/getActionProcessor/webserver/index.d.ts +0 -1
  118. package/lib/commonjs/getActionProcessor/webserver/index.js +1 -3
  119. package/lib/commonjs/getActionProcessor/webserver/serviceFunction/getServiceFunctionExecuteActionProcessor.js +1 -1
  120. package/lib/commonjs/index.d.ts +1 -0
  121. package/lib/commonjs/index.js +3 -0
  122. package/lib/commonjs/lambdaExtensions/getLogExtensionLayerPath.d.ts +10 -0
  123. package/lib/commonjs/lambdaExtensions/getLogExtensionLayerPath.js +20 -0
  124. package/lib/commonjs/lambdaExtensions/logExtensionPort.d.ts +1 -0
  125. package/lib/commonjs/lambdaExtensions/logExtensionPort.js +7 -0
  126. package/lib/commonjs/lambdaHandlers/getApiGatewayEventHandler.js +4 -8
  127. package/lib/commonjs/lambdaHandlers/getApiGatewayEventHandler_redirect.js +0 -2
  128. package/lib/commonjs/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.js +2 -2
  129. package/lib/commonjs/lambdaHandlers/helpers/logger.d.ts +4 -1
  130. package/lib/commonjs/lambdaHandlers/helpers/logger.js +94 -36
  131. package/lib/commonjs/logic/cognito/associateSoftwareToken.d.ts +2 -0
  132. package/lib/commonjs/logic/cognito/associateSoftwareToken.js +28 -0
  133. package/lib/commonjs/logic/cognito/decodeValidJwt.js +2 -1
  134. package/lib/commonjs/logic/cognito/getUserAttributesBySub.d.ts +4 -0
  135. package/lib/commonjs/logic/cognito/getUserAttributesBySub.js +12 -2
  136. package/lib/commonjs/logic/cognito/utils/transformCognitoResponse.js +2 -0
  137. package/lib/commonjs/logic/cognito/verifySoftwareToken.d.ts +1 -0
  138. package/lib/commonjs/logic/cognito/verifySoftwareToken.js +28 -0
  139. package/lib/commonjs/logic/dynamo/qpqDynamoOrm/getDynamoTableIndexByConfigAndQuery.js +8 -2
  140. package/lib/commonjs/logic/s3/generatePresignedUploadUrl.js +8 -1
  141. package/lib/commonjs/logic/s3/objectExists.js +9 -3
  142. package/lib/esm/awsNamingUtils.d.ts +1 -0
  143. package/lib/esm/awsNamingUtils.js +10 -0
  144. package/lib/esm/getActionProcessor/core/ai/aiModelMap.js +9 -9
  145. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js +12 -39
  146. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +18 -47
  147. package/lib/esm/getActionProcessor/core/ai/logic/aiStreamPartMappers.d.ts +6 -0
  148. package/lib/esm/getActionProcessor/core/ai/logic/aiStreamPartMappers.js +54 -0
  149. package/lib/esm/getActionProcessor/core/ai/logic/index.d.ts +32 -0
  150. package/lib/esm/getActionProcessor/core/ai/logic/index.js +32 -0
  151. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamAbort.d.ts +3 -0
  152. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamAbort.js +5 -0
  153. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamCustom.d.ts +3 -0
  154. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamCustom.js +5 -0
  155. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamError.d.ts +3 -0
  156. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamError.js +6 -0
  157. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFilePart.d.ts +3 -0
  158. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFilePart.js +8 -0
  159. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinish.d.ts +3 -0
  160. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinish.js +7 -0
  161. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.d.ts +3 -0
  162. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js +7 -0
  163. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamPart.d.ts +3 -0
  164. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamPart.js +5 -0
  165. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamRaw.d.ts +2 -0
  166. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamRaw.js +4 -0
  167. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningDelta.d.ts +3 -0
  168. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningDelta.js +6 -0
  169. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningEnd.d.ts +3 -0
  170. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningEnd.js +5 -0
  171. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningFilePart.d.ts +3 -0
  172. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningFilePart.js +8 -0
  173. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningStart.d.ts +3 -0
  174. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamReasoningStart.js +5 -0
  175. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamSourcePart.d.ts +3 -0
  176. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamSourcePart.js +12 -0
  177. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamStart.d.ts +2 -0
  178. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamStart.js +4 -0
  179. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamStartStep.d.ts +2 -0
  180. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamStartStep.js +4 -0
  181. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamTextDelta.d.ts +3 -0
  182. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamTextDelta.js +6 -0
  183. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamTextEnd.d.ts +3 -0
  184. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamTextEnd.js +5 -0
  185. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamTextStart.d.ts +3 -0
  186. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamTextStart.js +5 -0
  187. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalRequest.d.ts +3 -0
  188. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalRequest.js +8 -0
  189. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalResponse.d.ts +3 -0
  190. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolApprovalResponse.js +9 -0
  191. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolCall.d.ts +3 -0
  192. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolCall.js +7 -0
  193. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolError.d.ts +3 -0
  194. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolError.js +9 -0
  195. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolInputDelta.d.ts +3 -0
  196. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolInputDelta.js +6 -0
  197. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolInputEnd.d.ts +3 -0
  198. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolInputEnd.js +5 -0
  199. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolInputStart.d.ts +3 -0
  200. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolInputStart.js +6 -0
  201. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolOutputDenied.d.ts +3 -0
  202. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolOutputDenied.js +6 -0
  203. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolResult.d.ts +3 -0
  204. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamToolResult.js +8 -0
  205. package/lib/esm/getActionProcessor/core/ai/logic/prepareAiPromptCall.d.ts +19 -0
  206. package/lib/esm/getActionProcessor/core/ai/logic/prepareAiPromptCall.js +40 -0
  207. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamUsage.d.ts +6 -0
  208. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamUsage.js +5 -0
  209. package/lib/esm/getActionProcessor/core/ai/logic/toErrorMessage.d.ts +1 -0
  210. package/lib/esm/getActionProcessor/core/ai/logic/toErrorMessage.js +7 -0
  211. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.d.ts +3 -0
  212. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.js +78 -0
  213. package/lib/esm/getActionProcessor/core/ai/types/aiSdkStreamPart.d.ts +5 -0
  214. package/lib/esm/getActionProcessor/core/ai/types/aiSdkStreamPart.js +1 -0
  215. package/lib/esm/getActionProcessor/core/ai/types/index.d.ts +1 -0
  216. package/lib/esm/getActionProcessor/core/ai/types/index.js +1 -0
  217. package/lib/esm/getActionProcessor/core/apiKeyValidation/getApiKeyValidationValidateActionProcessor.js +13 -2
  218. package/lib/esm/getActionProcessor/core/config/getConfigGetSecretActionProcessor.js +11 -3
  219. package/lib/esm/getActionProcessor/core/config/getConfigSetParameterActionProcessor.js +11 -3
  220. package/lib/esm/getActionProcessor/core/config/index.js +0 -2
  221. package/lib/esm/getActionProcessor/core/eventBus/getEventBusSendMessagesActionProcessor.js +19 -9
  222. package/lib/esm/getActionProcessor/core/file/getFileDeleteActionProcessor.js +18 -10
  223. package/lib/esm/getActionProcessor/core/file/getFileExistsActionProcessor.js +10 -2
  224. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js +6 -1
  225. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js +6 -1
  226. package/lib/esm/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js +14 -3
  227. package/lib/esm/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js +20 -11
  228. package/lib/esm/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js +12 -3
  229. package/lib/esm/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js +8 -3
  230. package/lib/esm/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js +12 -3
  231. package/lib/esm/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js +12 -3
  232. package/lib/esm/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js +12 -3
  233. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js +11 -3
  234. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js +11 -3
  235. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js +11 -3
  236. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +12 -4
  237. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js +12 -3
  238. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js +11 -3
  239. package/lib/esm/getActionProcessor/core/queue/getQueueSendMessageActionProcessor.js +20 -10
  240. package/lib/esm/getActionProcessor/core/system/getSystemExecuteStoryActionProcessor.js +1 -0
  241. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryAssociateSoftwareTokenActionProcessor.d.ts +2 -0
  242. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryAssociateSoftwareTokenActionProcessor.js +13 -0
  243. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryChangePasswordActionProcessor.js +12 -3
  244. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryConfirmEmailVerificationActionProcessor.js +12 -3
  245. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryConfirmForgotPasswordActionProcessor.js +13 -3
  246. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryCreateUserActionProcessor.js +13 -4
  247. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryDecodeAccessTokenActionProcessor.js +2 -2
  248. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryForgotPasswordActionProcessor.js +11 -3
  249. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryGetUserAttributesByUserIdActionProcessor.js +10 -3
  250. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryGetUsersActionProcessor.js +11 -3
  251. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryGetUsersByAttributeActionProcessor.js +11 -3
  252. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRefreshTokenActionProcessor.js +18 -4
  253. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js +12 -3
  254. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRespondToAuthChallengeActionProcessor.js +35 -3
  255. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectorySetPasswordActionProcessor.js +13 -3
  256. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectorySetUserAttributesActionProcessor.js +14 -3
  257. package/lib/esm/getActionProcessor/core/userDirectory/index.js +2 -0
  258. package/lib/esm/getActionProcessor/webserver/index.d.ts +0 -1
  259. package/lib/esm/getActionProcessor/webserver/index.js +0 -3
  260. package/lib/esm/getActionProcessor/webserver/serviceFunction/getServiceFunctionExecuteActionProcessor.js +2 -2
  261. package/lib/esm/index.d.ts +1 -0
  262. package/lib/esm/index.js +3 -0
  263. package/lib/esm/lambdaExtensions/getLogExtensionLayerPath.d.ts +10 -0
  264. package/lib/esm/lambdaExtensions/getLogExtensionLayerPath.js +13 -0
  265. package/lib/esm/lambdaExtensions/logExtensionPort.d.ts +1 -0
  266. package/lib/esm/lambdaExtensions/logExtensionPort.js +4 -0
  267. package/lib/esm/lambdaHandlers/getApiGatewayEventHandler.js +4 -8
  268. package/lib/esm/lambdaHandlers/getApiGatewayEventHandler_redirect.js +0 -2
  269. package/lib/esm/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.js +1 -1
  270. package/lib/esm/lambdaHandlers/helpers/logger.d.ts +4 -1
  271. package/lib/esm/lambdaHandlers/helpers/logger.js +94 -38
  272. package/lib/esm/logic/cognito/associateSoftwareToken.d.ts +2 -0
  273. package/lib/esm/logic/cognito/associateSoftwareToken.js +15 -0
  274. package/lib/esm/logic/cognito/decodeValidJwt.js +2 -1
  275. package/lib/esm/logic/cognito/getUserAttributesBySub.d.ts +4 -0
  276. package/lib/esm/logic/cognito/getUserAttributesBySub.js +10 -1
  277. package/lib/esm/logic/cognito/utils/transformCognitoResponse.js +2 -0
  278. package/lib/esm/logic/cognito/verifySoftwareToken.d.ts +1 -0
  279. package/lib/esm/logic/cognito/verifySoftwareToken.js +15 -0
  280. package/lib/esm/logic/dynamo/qpqDynamoOrm/getDynamoTableIndexByConfigAndQuery.js +7 -2
  281. package/lib/esm/logic/s3/generatePresignedUploadUrl.js +8 -1
  282. package/lib/esm/logic/s3/objectExists.js +8 -3
  283. package/lib/extension-layer/extensions/qpq-log-extension +2 -0
  284. package/lib/extension-layer/qpq-log-extension/index.js +58 -0
  285. package/package.json +10 -8
  286. package/lib/commonjs/getActionProcessor/core/config/getConfigGetGlobalActionProcessor.d.ts +0 -2
  287. package/lib/commonjs/getActionProcessor/core/config/getConfigGetGlobalActionProcessor.js +0 -25
  288. package/lib/commonjs/getActionProcessor/webserver/extract/getExtractExpenseActionProcessor.d.ts +0 -2
  289. package/lib/commonjs/getActionProcessor/webserver/extract/getExtractExpenseActionProcessor.js +0 -56
  290. package/lib/commonjs/getActionProcessor/webserver/extract/index.d.ts +0 -2
  291. package/lib/commonjs/getActionProcessor/webserver/extract/index.js +0 -17
  292. package/lib/commonjs/logic/textract/analyzeExpense.d.ts +0 -51
  293. package/lib/commonjs/logic/textract/analyzeExpense.js +0 -31
  294. package/lib/commonjs/logic/textract/index.d.ts +0 -2
  295. package/lib/commonjs/logic/textract/transformExpenseResponse.d.ts +0 -29
  296. package/lib/commonjs/logic/textract/transformExpenseResponse.js +0 -180
  297. package/lib/esm/getActionProcessor/core/config/getConfigGetGlobalActionProcessor.d.ts +0 -2
  298. package/lib/esm/getActionProcessor/core/config/getConfigGetGlobalActionProcessor.js +0 -10
  299. package/lib/esm/getActionProcessor/webserver/extract/getExtractExpenseActionProcessor.d.ts +0 -2
  300. package/lib/esm/getActionProcessor/webserver/extract/getExtractExpenseActionProcessor.js +0 -40
  301. package/lib/esm/getActionProcessor/webserver/extract/index.d.ts +0 -2
  302. package/lib/esm/getActionProcessor/webserver/extract/index.js +0 -4
  303. package/lib/esm/logic/textract/analyzeExpense.d.ts +0 -51
  304. package/lib/esm/logic/textract/analyzeExpense.js +0 -18
  305. package/lib/esm/logic/textract/index.d.ts +0 -2
  306. package/lib/esm/logic/textract/index.js +0 -2
  307. package/lib/esm/logic/textract/transformExpenseResponse.d.ts +0 -29
  308. package/lib/esm/logic/textract/transformExpenseResponse.js +0 -173
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectoryGetUserAttributesByUserIdErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
4
4
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
5
5
  import { getUserAttributesBySub } from '../../../logic/cognito/getUserAttributesBySub';
@@ -7,8 +7,15 @@ const getProcessGetUserAttributesByUserId = (qpqConfig) => {
7
7
  return async ({ userDirectoryName, userId }, session) => {
8
8
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
9
9
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
10
- const userAttributes = await getUserAttributesBySub(userPoolId, region, userId);
11
- return actionResult(userAttributes);
10
+ try {
11
+ const userAttributes = await getUserAttributesBySub(userPoolId, region, userId);
12
+ return actionResult(userAttributes);
13
+ }
14
+ catch (error) {
15
+ return actionResultErrorFromCaughtError(error, {
16
+ USER_NOT_FOUND: () => actionResultError(UserDirectoryGetUserAttributesByUserIdErrorTypeEnum.UserNotFound, 'No user found for this userId'),
17
+ });
18
+ }
12
19
  };
13
20
  };
14
21
  export const getUserDirectoryGetUserAttributesByUserIdActionProcessor = async (qpqConfig) => ({
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectoryGetUsersErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
4
4
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
5
5
  import { listPagedUsers } from '../../../logic/cognito/listPagedUsers';
@@ -7,8 +7,16 @@ const getProcessGetUsers = (qpqConfig) => {
7
7
  return async ({ userDirectoryName, nextPageKey }, session) => {
8
8
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
9
9
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
10
- const userAttributes = await listPagedUsers(userPoolId, region, nextPageKey);
11
- return actionResult(userAttributes);
10
+ try {
11
+ const userAttributes = await listPagedUsers(userPoolId, region, nextPageKey);
12
+ return actionResult(userAttributes);
13
+ }
14
+ catch (error) {
15
+ return actionResultErrorFromCaughtError(error, {
16
+ InvalidParameterException: () => actionResultError(UserDirectoryGetUsersErrorTypeEnum.InvalidPageKey, 'The supplied page key is invalid'),
17
+ TooManyRequestsException: () => actionResultError(UserDirectoryGetUsersErrorTypeEnum.LimitExceeded, 'Too many requests, please try again later'),
18
+ });
19
+ }
12
20
  };
13
21
  };
14
22
  export const getUserDirectoryGetUsersActionProcessor = async (qpqConfig) => ({
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectoryGetUsersByAttributeErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
4
4
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
5
5
  import { listPagedUsersByAttribute } from '../../../logic/cognito/listPagedUsersByAttribute';
@@ -7,8 +7,16 @@ const getProcessGetUsersByAttribute = (qpqConfig) => {
7
7
  return async ({ userDirectoryName, attribueName, attribueValue, limit, nextPageKey }, _session) => {
8
8
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
9
9
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
10
- const userAttributes = await listPagedUsersByAttribute(userPoolId, region, attribueName, attribueValue, limit, nextPageKey);
11
- return actionResult(userAttributes);
10
+ try {
11
+ const userAttributes = await listPagedUsersByAttribute(userPoolId, region, attribueName, attribueValue, limit, nextPageKey);
12
+ return actionResult(userAttributes);
13
+ }
14
+ catch (error) {
15
+ return actionResultErrorFromCaughtError(error, {
16
+ InvalidParameterException: () => actionResultError(UserDirectoryGetUsersByAttributeErrorTypeEnum.InvalidSearchParameters, 'The search attribute, value, limit, or page key is invalid'),
17
+ TooManyRequestsException: () => actionResultError(UserDirectoryGetUsersByAttributeErrorTypeEnum.LimitExceeded, 'Too many requests, please try again later'),
18
+ });
19
+ }
12
20
  };
13
21
  };
14
22
  export const getUserDirectoryGetUsersByAttributeActionProcessor = async (qpqConfig) => ({
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, actionResultError, ErrorTypeEnum, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectoryRefreshTokenErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { getCFExportNameUserPoolClientIdFromConfig, getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
4
4
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
5
5
  import { refreshToken as cognitoRefreshToken } from '../../../logic/cognito/refreshToken';
@@ -9,10 +9,24 @@ const getProcessRefreshToken = (qpqConfig) => {
9
9
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
10
10
  const userPoolClientId = await getExportedValue(getCFExportNameUserPoolClientIdFromConfig(userDirectoryName, qpqConfig), region);
11
11
  if (!session.decodedAccessToken || !session.decodedAccessToken.username) {
12
- return actionResultError(ErrorTypeEnum.Unauthorized, 'Invalid accessToken');
12
+ return actionResultError(UserDirectoryRefreshTokenErrorTypeEnum.Unauthorized, 'Invalid accessToken');
13
+ }
14
+ // NOTE: we intentionally do NOT gate on decodedAccessToken.wasValid here.
15
+ // Refresh must accept a signature-valid-but-expired access token (that's the
16
+ // point of refreshing), and wasValid folds in the expiry check. The trust
17
+ // anchor for this operation is the refreshToken itself: Cognito's
18
+ // REFRESH_TOKEN_AUTH validates it and the SECRET_HASH binds it to `username`,
19
+ // so a forged/unverified username cannot mint tokens for another user.
20
+ try {
21
+ const authResponse = await cognitoRefreshToken(userPoolId, userPoolClientId, qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig), session.decodedAccessToken.username, refreshToken);
22
+ return actionResult(authResponse);
23
+ }
24
+ catch (error) {
25
+ return actionResultErrorFromCaughtError(error, {
26
+ NotAuthorizedException: () => actionResultError(UserDirectoryRefreshTokenErrorTypeEnum.Unauthorized, 'Refresh token is invalid or has expired'),
27
+ TooManyRequestsException: () => actionResultError(UserDirectoryRefreshTokenErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
28
+ });
13
29
  }
14
- const authResponse = await cognitoRefreshToken(userPoolId, userPoolClientId, qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig), session.decodedAccessToken.username, refreshToken);
15
- return actionResult(authResponse);
16
30
  };
17
31
  };
18
32
  export const getUserDirectoryRefreshTokenActionProcessor = async (qpqConfig) => ({
@@ -1,11 +1,20 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectoryRequestEmailVerificationErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { requestEmailVerificationCode } from '../../../logic/cognito/requestEmailVerificationCode';
4
4
  const getProcessRequestEmailVerification = (qpqConfig) => {
5
5
  return async ({ userDirectoryName, accessToken }) => {
6
6
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
7
- await requestEmailVerificationCode(region, accessToken);
8
- return actionResult(void 0);
7
+ try {
8
+ await requestEmailVerificationCode(region, accessToken);
9
+ return actionResult(void 0);
10
+ }
11
+ catch (error) {
12
+ return actionResultErrorFromCaughtError(error, {
13
+ NotAuthorizedException: () => actionResultError(UserDirectoryRequestEmailVerificationErrorTypeEnum.Unauthorized, 'Access token is invalid or has expired'),
14
+ LimitExceededException: () => actionResultError(UserDirectoryRequestEmailVerificationErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
15
+ CodeDeliveryFailureException: () => actionResultError(UserDirectoryRequestEmailVerificationErrorTypeEnum.CodeDeliveryFailed, 'Could not deliver the verification code'),
16
+ });
17
+ }
9
18
  };
10
19
  };
11
20
  export const getUserDirectoryRequestEmailVerificationActionProcessor = async (qpqConfig) => ({
@@ -1,9 +1,10 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, AuthenticateUserChallenge, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, AuthenticateUserChallenge, UserDirectoryActionType, UserDirectoryRespondToAuthChallengeErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { ChallengeNameType } from '@aws-sdk/client-cognito-identity-provider';
4
4
  import { getCFExportNameUserPoolClientIdFromConfig, getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
5
5
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
6
6
  import { respondToAuthChallengeChallenge } from '../../../logic/cognito/respondToAuthChallengeChallenge';
7
+ import { verifySoftwareToken } from '../../../logic/cognito/verifySoftwareToken';
7
8
  const anyAuthChallengeToCognitoAttributes = (authChallenge) => {
8
9
  switch (authChallenge.challenge) {
9
10
  case AuthenticateUserChallenge.NEW_PASSWORD_REQUIRED:
@@ -14,6 +15,14 @@ const anyAuthChallengeToCognitoAttributes = (authChallenge) => {
14
15
  return {
15
16
  ANSWER: JSON.stringify(authChallenge.challengeAnswer),
16
17
  };
18
+ case AuthenticateUserChallenge.SOFTWARE_TOKEN_MFA:
19
+ return {
20
+ SOFTWARE_TOKEN_MFA_CODE: authChallenge.mfaCode,
21
+ };
22
+ // MFA_SETUP completes with just USERNAME/SESSION — the TOTP code is consumed
23
+ // by the preceding VerifySoftwareToken call, not by RespondToAuthChallenge.
24
+ case AuthenticateUserChallenge.MFA_SETUP:
25
+ return {};
17
26
  default:
18
27
  return {};
19
28
  }
@@ -24,6 +33,10 @@ const anyAuthChallengeToCognitoChallengeName = (authChallenge) => {
24
33
  return ChallengeNameType.NEW_PASSWORD_REQUIRED;
25
34
  case AuthenticateUserChallenge.CUSTOM_CHALLENGE:
26
35
  return ChallengeNameType.CUSTOM_CHALLENGE;
36
+ case AuthenticateUserChallenge.SOFTWARE_TOKEN_MFA:
37
+ return ChallengeNameType.SOFTWARE_TOKEN_MFA;
38
+ case AuthenticateUserChallenge.MFA_SETUP:
39
+ return ChallengeNameType.MFA_SETUP;
27
40
  default:
28
41
  throw new Error(`Unknown challenge`);
29
42
  }
@@ -33,8 +46,27 @@ const getProcessRespondToAuthChallenge = (qpqConfig) => {
33
46
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
34
47
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
35
48
  const userPoolClientId = await getExportedValue(getCFExportNameUserPoolClientIdFromConfig(userDirectoryName, qpqConfig), region);
36
- const response = await respondToAuthChallengeChallenge(userPoolId, userPoolClientId, region, authChallenge.username, authChallenge.session, anyAuthChallengeToCognitoChallengeName(authChallenge), anyAuthChallengeToCognitoAttributes(authChallenge));
37
- return actionResult(response);
49
+ // MFA_SETUP must verify the TOTP code first; Cognito returns a fresh session
50
+ // that is then used to complete the challenge and issue tokens.
51
+ let session = authChallenge.session;
52
+ try {
53
+ if (authChallenge.challenge === AuthenticateUserChallenge.MFA_SETUP) {
54
+ session = await verifySoftwareToken(region, session, authChallenge.mfaCode);
55
+ }
56
+ const response = await respondToAuthChallengeChallenge(userPoolId, userPoolClientId, region, authChallenge.username, session, anyAuthChallengeToCognitoChallengeName(authChallenge), anyAuthChallengeToCognitoAttributes(authChallenge));
57
+ return actionResult(response);
58
+ }
59
+ catch (error) {
60
+ return actionResultErrorFromCaughtError(error, {
61
+ CodeMismatchException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.InvalidCode, 'The supplied code is incorrect'),
62
+ EnableSoftwareTokenMFAException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.InvalidCode, 'The supplied code is incorrect'),
63
+ ExpiredCodeException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.ExpiredCode, 'The supplied code has expired'),
64
+ InvalidPasswordException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.InvalidNewPassword, 'New password does not meet the password policy'),
65
+ NotAuthorizedException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.Unauthorized, 'The challenge session is invalid or has expired'),
66
+ LimitExceededException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
67
+ TooManyRequestsException: () => actionResultError(UserDirectoryRespondToAuthChallengeErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
68
+ });
69
+ }
38
70
  };
39
71
  };
40
72
  export const getUserDirectoryRespondToAuthChallengeActionProcessor = async (qpqConfig) => ({
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectorySetPasswordErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
4
4
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
5
5
  import { resolveUsernameByPreferredUsername } from '../../../logic/cognito/resolveUsernameByPreferredUsername';
@@ -9,8 +9,18 @@ const getProcessSetPassword = (qpqConfig) => {
9
9
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
10
10
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
11
11
  const resolvedUsername = await resolveUsernameByPreferredUsername(userPoolId, region, username);
12
- await setUserPassword(region, userPoolId, resolvedUsername, newPassword);
13
- return actionResult(void 0);
12
+ try {
13
+ await setUserPassword(region, userPoolId, resolvedUsername, newPassword);
14
+ return actionResult(void 0);
15
+ }
16
+ catch (error) {
17
+ return actionResultErrorFromCaughtError(error, {
18
+ UserNotFoundException: () => actionResultError(UserDirectorySetPasswordErrorTypeEnum.UserNotFound, 'No account found for this user'),
19
+ InvalidPasswordException: () => actionResultError(UserDirectorySetPasswordErrorTypeEnum.InvalidNewPassword, 'Password does not meet the password policy'),
20
+ LimitExceededException: () => actionResultError(UserDirectorySetPasswordErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
21
+ TooManyRequestsException: () => actionResultError(UserDirectorySetPasswordErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
22
+ });
23
+ }
14
24
  };
15
25
  };
16
26
  export const getUserDirectorySetPasswordActionProcessor = async (qpqConfig) => ({
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, UserDirectoryActionType, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, UserDirectoryActionType, UserDirectorySetUserAttributesErrorTypeEnum, } from 'quidproquo-core';
3
3
  import { getCFExportNameUserPoolIdFromConfig } from '../../../awsNamingUtils';
4
4
  import { getExportedValue } from '../../../logic/cloudformation/getExportedValue';
5
5
  import { resolveUsernameByPreferredUsername } from '../../../logic/cognito/resolveUsernameByPreferredUsername';
@@ -9,8 +9,19 @@ const getProcessSetUserAttributes = (qpqConfig) => {
9
9
  const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
10
10
  const userPoolId = await getExportedValue(getCFExportNameUserPoolIdFromConfig(userDirectoryName, qpqConfig), region);
11
11
  const resolvedUsername = await resolveUsernameByPreferredUsername(userPoolId, region, username);
12
- await setUserAttributes(userPoolId, region, resolvedUsername, userAttributes);
13
- return actionResult(void 0);
12
+ try {
13
+ await setUserAttributes(userPoolId, region, resolvedUsername, userAttributes);
14
+ return actionResult(void 0);
15
+ }
16
+ catch (error) {
17
+ return actionResultErrorFromCaughtError(error, {
18
+ UserNotFoundException: () => actionResultError(UserDirectorySetUserAttributesErrorTypeEnum.UserNotFound, 'No account found for this user'),
19
+ InvalidParameterException: () => actionResultError(UserDirectorySetUserAttributesErrorTypeEnum.InvalidAttributes, 'One or more attributes are invalid'),
20
+ AliasExistsException: () => actionResultError(UserDirectorySetUserAttributesErrorTypeEnum.AliasExists, 'That email or phone number is already in use'),
21
+ LimitExceededException: () => actionResultError(UserDirectorySetUserAttributesErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
22
+ TooManyRequestsException: () => actionResultError(UserDirectorySetUserAttributesErrorTypeEnum.LimitExceeded, 'Too many attempts, please try again later'),
23
+ });
24
+ }
14
25
  };
15
26
  };
16
27
  export const getUserDirectorySetUserAttributesActionProcessor = async (qpqConfig) => ({
@@ -1,3 +1,4 @@
1
+ import { getUserDirectoryAssociateSoftwareTokenActionProcessor } from './getUserDirectoryAssociateSoftwareTokenActionProcessor';
1
2
  import { getUserDirectoryAuthenticateUserActionProcessor } from './getUserDirectoryAuthenticateUserActionProcessor';
2
3
  import { getUserDirectoryChangePasswordActionProcessor } from './getUserDirectoryChangePasswordActionProcessor';
3
4
  import { getUserDirectoryConfirmEmailVerificationActionProcessor } from './getUserDirectoryConfirmEmailVerificationActionProcessor';
@@ -17,6 +18,7 @@ import { getUserDirectorySetAccessTokenActionProcessor } from './getUserDirector
17
18
  import { getUserDirectorySetPasswordActionProcessor } from './getUserDirectorySetPasswordActionProcessor';
18
19
  import { getUserDirectorySetUserAttributesActionProcessor } from './getUserDirectorySetUserAttributesActionProcessor';
19
20
  export const getUserDirectoryActionProcessor = async (qpqConfig, dynamicModuleLoader) => ({
21
+ ...(await getUserDirectoryAssociateSoftwareTokenActionProcessor(qpqConfig, dynamicModuleLoader)),
20
22
  ...(await getUserDirectoryAuthenticateUserActionProcessor(qpqConfig, dynamicModuleLoader)),
21
23
  ...(await getUserDirectoryChangePasswordActionProcessor(qpqConfig, dynamicModuleLoader)),
22
24
  ...(await getUserDirectoryConfirmEmailVerificationActionProcessor(qpqConfig, dynamicModuleLoader)),
@@ -1,4 +1,3 @@
1
- export * from './extract';
2
1
  export * from './serviceFunction';
3
2
  export * from './webEntry';
4
3
  export * from './websocket';
@@ -1,13 +1,10 @@
1
- import { getExtractActionProcessor } from './extract';
2
1
  import { getServiceFunctionActionProcessor } from './serviceFunction';
3
2
  import { getWebEntryActionProcessor } from './webEntry';
4
3
  import { getWebsocketActionProcessor } from './websocket';
5
- export * from './extract';
6
4
  export * from './serviceFunction';
7
5
  export * from './webEntry';
8
6
  export * from './websocket';
9
7
  export const getWebserverActionProcessor = async (qpqConfig, dynamicModuleLoader) => ({
10
- ...(await getExtractActionProcessor(qpqConfig, dynamicModuleLoader)),
11
8
  ...(await getWebEntryActionProcessor(qpqConfig, dynamicModuleLoader)),
12
9
  ...(await getServiceFunctionActionProcessor(qpqConfig, dynamicModuleLoader)),
13
10
  ...(await getWebsocketActionProcessor(qpqConfig, dynamicModuleLoader)),
@@ -1,5 +1,5 @@
1
1
  import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
- import { actionResult, actionResultError, qpqCoreUtils, } from 'quidproquo-core';
2
+ import { actionResult, actionResultError, qpqCoreUtils, toCrossServiceSession, } from 'quidproquo-core';
3
3
  import { ServiceFunctionActionType } from 'quidproquo-webserver';
4
4
  import { getConfigRuntimeResourceName } from '../../../awsNamingUtils';
5
5
  import { executeLambdaByName } from '../../../logic/lambda/executeLambdaByName';
@@ -13,7 +13,7 @@ const getProcessExecute = (qpqConfig) => {
13
13
  const serviceFunctionEvent = {
14
14
  functionName: functionName,
15
15
  payload: payload,
16
- storySession: session,
16
+ storySession: toCrossServiceSession(session),
17
17
  };
18
18
  const result = await executeLambdaByName(awsFunctionName, region, serviceFunctionEvent, isAsync);
19
19
  if (!result) {
@@ -8,3 +8,4 @@ export * from './logic';
8
8
  export * from './logic/cache/memoFunc';
9
9
  export * from './logic/parametersManager/getParameter';
10
10
  export * from './logic/parametersManager/getParameters';
11
+ export * from './lambdaExtensions/getLogExtensionLayerPath';
package/lib/esm/index.js CHANGED
@@ -9,3 +9,6 @@ export * from './logic';
9
9
  export * from './logic/cache/memoFunc';
10
10
  export * from './logic/parametersManager/getParameter';
11
11
  export * from './logic/parametersManager/getParameters';
12
+ // Log extension layer path + handler port. NOTE: never export the extension
13
+ // entry (./lambdaExtensions/qpqLogExtension) -- it self-executes on import.
14
+ export * from './lambdaExtensions/getLogExtensionLayerPath';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Absolute path to the built qpq-log-extension layer directory (contains the
3
+ * `extensions/` folder). Produced by scripts/buildLogExtensionLayer.mjs and
4
+ * shipped under lib/extension-layer. Used by the CDK layer construct as the
5
+ * LayerVersion asset source.
6
+ *
7
+ * Resolved relative to this compiled file: lib/<format>/lambdaExtensions/<this>
8
+ * -> ../../extension-layer.
9
+ */
10
+ export declare const getLogExtensionLayerPath: () => string;
@@ -0,0 +1,13 @@
1
+ import path from 'path';
2
+ /**
3
+ * Absolute path to the built qpq-log-extension layer directory (contains the
4
+ * `extensions/` folder). Produced by scripts/buildLogExtensionLayer.mjs and
5
+ * shipped under lib/extension-layer. Used by the CDK layer construct as the
6
+ * LayerVersion asset source.
7
+ *
8
+ * Resolved relative to this compiled file: lib/<format>/lambdaExtensions/<this>
9
+ * -> ../../extension-layer.
10
+ */
11
+ export const getLogExtensionLayerPath = () => {
12
+ return path.resolve(__dirname, '..', '..', 'extension-layer');
13
+ };
@@ -0,0 +1 @@
1
+ export declare const LOG_EXTENSION_PORT = 9009;
@@ -0,0 +1,4 @@
1
+ // Fixed localhost port the function handler uses to reach the qpq-log-extension.
2
+ // Hardcoded on both ends — the handler and the extension always ship together, so
3
+ // there's no need to pass it through an env var.
4
+ export const LOG_EXTENSION_PORT = 9009;
@@ -1,11 +1,7 @@
1
1
  import { QpqRuntimeType } from 'quidproquo-core';
2
2
  import { getApiGatewayApiEventEventProcessor } from '../getActionProcessor';
3
3
  import { getQpqLambdaRuntimeForEvent } from './helpers/getQpqLambdaRuntimeForEvent';
4
- export const getApiGatewayEventHandler = (dynamicModuleLoader, qpqConfig) => getQpqLambdaRuntimeForEvent(QpqRuntimeType.API, (event) => {
5
- console.log('event', JSON.stringify(event, null, 2));
6
- console.log(event);
7
- return {
8
- depth: 0,
9
- context: {},
10
- };
11
- }, getApiGatewayApiEventEventProcessor, dynamicModuleLoader, qpqConfig);
4
+ export const getApiGatewayEventHandler = (dynamicModuleLoader, qpqConfig) => getQpqLambdaRuntimeForEvent(QpqRuntimeType.API, () => ({
5
+ depth: 0,
6
+ context: {},
7
+ }), getApiGatewayApiEventEventProcessor, dynamicModuleLoader, qpqConfig);
@@ -1,6 +1,4 @@
1
1
  const apiGatewayEventHandler_redirect = async (event, context) => {
2
- console.log('event: ', JSON.stringify(event, null, 2));
3
- console.log('process.env: ', JSON.stringify(process.env, null, 2));
4
2
  const redirectConfig = JSON.parse(process.env.redirectConfig);
5
3
  // For direct urls ~ Go straight to the url
6
4
  let redirectUrl = redirectConfig.redirectUrl;
@@ -1,4 +1,4 @@
1
- import { getCustomActionActionProcessor } from 'quidproquo-actionprocessor-node';
1
+ import { getCustomActionActionProcessor } from 'quidproquo-actionprocessor-js';
2
2
  import { askProcessEvent, createRuntime, } from 'quidproquo-core';
3
3
  import { getAwsActionProcessors } from '../../getActionProcessor';
4
4
  import { dynamicModuleLoaderWarmer } from './dynamicModuleLoaderWarmer';
@@ -1,5 +1,8 @@
1
1
  import { QPQConfig, QpqLogger, StoryResult } from 'quidproquo-core';
2
- export declare const storyLogger: (result: StoryResult<any>, bucketName: string, region: string) => Promise<void>;
2
+ import { S3Client } from '@aws-sdk/client-s3';
3
+ export declare const storyLogger: (result: StoryResult<any>, bucketName: string, s3Client: S3Client) => Promise<void>;
3
4
  export declare const storyLoggerFs: (result: StoryResult<any>) => Promise<void>;
4
5
  export declare const moveLogsToPerminateStorage: (bucketName: string, region: string) => Promise<void>;
6
+ export declare const getS3Logger: (qpqConfig: QPQConfig) => QpqLogger;
7
+ export declare const getS3LoggerViaExtension: (qpqConfig: QPQConfig) => QpqLogger;
5
8
  export declare const getLogger: (qpqConfig: QPQConfig) => QpqLogger;
@@ -1,14 +1,14 @@
1
- import { LogActionType, qpqCoreUtils } from 'quidproquo-core';
1
+ import { LogActionType, QPQ_LOGS_STORAGE_DRIVE_NAME, qpqCoreUtils } from 'quidproquo-core';
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
4
  import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
5
5
  import { getConfigRuntimeResourceName } from '../../awsNamingUtils';
6
+ import { LOG_EXTENSION_PORT } from '../../lambdaExtensions/logExtensionPort';
6
7
  const tempDirectory = '/tmp/qpqlogs';
7
8
  import { getAwsServiceAccountInfoByDeploymentInfo, getAwsServiceAccountInfoConfig } from 'quidproquo-config-aws';
8
9
  import { filterLogHistoryByActionTypes } from 'quidproquo-core';
9
- export const storyLogger = async (result, bucketName, region) => {
10
+ export const storyLogger = async (result, bucketName, s3Client) => {
10
11
  try {
11
- const s3Client = new S3Client({ region });
12
12
  const commandParams = {
13
13
  Key: `${result.correlation}.json`,
14
14
  Bucket: bucketName,
@@ -37,11 +37,12 @@ export const moveLogsToPerminateStorage = async (bucketName, region) => {
37
37
  try {
38
38
  await fs.promises.mkdir(tempDirectory, { recursive: true });
39
39
  const files = await fs.promises.readdir(tempDirectory);
40
+ const s3Client = new S3Client({ region });
40
41
  for (const file of files) {
41
42
  const filePath = path.join(tempDirectory, file);
42
43
  const data = await fs.promises.readFile(filePath, 'utf-8');
43
44
  const result = JSON.parse(data);
44
- await storyLogger(result, bucketName, region);
45
+ await storyLogger(result, bucketName, s3Client);
45
46
  await fs.promises.unlink(filePath);
46
47
  console.log(`Moved log file [${file}] to S3 and deleted from temporary directory`);
47
48
  }
@@ -51,49 +52,51 @@ export const moveLogsToPerminateStorage = async (bucketName, region) => {
51
52
  console.error(error);
52
53
  }
53
54
  };
54
- export const getLogger = (qpqConfig) => {
55
- const awsSettings = getAwsServiceAccountInfoConfig(qpqConfig);
56
- // If we have no log service, just return nothing.
57
- if (!awsSettings.logServiceName || awsSettings.disableLogs || process.env.storageDriveName === 'qpq-logs') {
58
- return {
59
- enableLogs: async () => { },
60
- log: async () => { },
61
- waitToFinishWriting: async () => { },
62
- moveToPermanentStorage: async () => { },
63
- };
64
- }
65
- const service = awsSettings.logServiceName;
55
+ const noopLogger = {
56
+ enableLogs: async () => { },
57
+ log: () => { },
58
+ waitToFinishWriting: async () => { },
59
+ moveToPermanentStorage: async () => { },
60
+ };
61
+ // Resolves which S3 bucket (and its region) story logs go to for this config.
62
+ const resolveLogTarget = (qpqConfig) => {
63
+ const service = getAwsServiceAccountInfoConfig(qpqConfig).logServiceName;
66
64
  const application = qpqCoreUtils.getApplicationName(qpqConfig);
67
65
  const environment = qpqCoreUtils.getApplicationModuleEnvironment(qpqConfig);
68
66
  const feature = qpqCoreUtils.getApplicationModuleFeature(qpqConfig);
69
- // Workout the bucket name.
70
- const bucketName = getConfigRuntimeResourceName('qpq-logs', application, service, environment, feature);
71
- // Where is this bucket?
67
+ const bucketName = getConfigRuntimeResourceName(QPQ_LOGS_STORAGE_DRIVE_NAME, application, service, environment, feature);
72
68
  const regionForBucket = getAwsServiceAccountInfoByDeploymentInfo(qpqConfig, service, environment, feature, application).awsRegion;
69
+ return { bucketName, regionForBucket };
70
+ };
71
+ // Shared plumbing for both loggers: defers each log to a microtask, applies the
72
+ // disabled-correlation history filter, and tracks the promises so
73
+ // waitToFinishWriting can await them. Only `ship` (how a log reaches S3) differs.
74
+ const createBufferedLogger = (bucketName, regionForBucket, ship) => {
73
75
  const logs = [];
74
76
  let disabledLogCorrelations = [];
75
77
  return {
76
78
  enableLogs: async (enable, reason, correlation) => {
77
- if (!enable) {
78
- disabledLogCorrelations = [...disabledLogCorrelations, correlation];
79
- }
80
- else {
81
- disabledLogCorrelations = disabledLogCorrelations.filter((dlc) => dlc !== correlation);
82
- }
79
+ disabledLogCorrelations = enable
80
+ ? disabledLogCorrelations.filter((dlc) => dlc !== correlation)
81
+ : [...disabledLogCorrelations, correlation];
83
82
  },
84
- log: async (result) => {
85
- let modifyableResult = !disabledLogCorrelations.includes(result.correlation)
86
- ? result
87
- : {
88
- ...result,
89
- history: filterLogHistoryByActionTypes(result.history, [
90
- LogActionType.Create,
91
- LogActionType.TemplateLiteral,
92
- LogActionType.DisableEventHistory,
93
- ]),
94
- };
95
- // TODO: Filter and flatten histories log histories
96
- const promise = storyLogger(modifyableResult, bucketName, regionForBucket).catch((e) => {
83
+ log: (result) => {
84
+ // Defer all work (including JSON.stringify) to a microtask so the caller is not blocked.
85
+ const promise = Promise.resolve()
86
+ .then(() => {
87
+ const modifyableResult = !disabledLogCorrelations.includes(result.correlation)
88
+ ? result
89
+ : {
90
+ ...result,
91
+ history: filterLogHistoryByActionTypes(result.history, [
92
+ LogActionType.Create,
93
+ LogActionType.TemplateLiteral,
94
+ LogActionType.DisableEventHistory,
95
+ ]),
96
+ };
97
+ return ship(modifyableResult);
98
+ })
99
+ .catch((e) => {
97
100
  console.log('Failed to log story result to S3', JSON.stringify(e, null, 2));
98
101
  });
99
102
  logs.push(promise);
@@ -106,3 +109,56 @@ export const getLogger = (qpqConfig) => {
106
109
  },
107
110
  };
108
111
  };
112
+ // Logs straight to S3: the handler awaits the PutObject itself. Simple and fully
113
+ // durable, but the invoke waits on S3. No extension required.
114
+ export const getS3Logger = (qpqConfig) => {
115
+ const { bucketName, regionForBucket } = resolveLogTarget(qpqConfig);
116
+ const s3Client = new S3Client({ region: regionForBucket });
117
+ return createBufferedLogger(bucketName, regionForBucket, (result) => storyLogger(result, bucketName, s3Client));
118
+ };
119
+ // Logs via the qpq-log-extension: a fast local HTTP POST hands the log off so the
120
+ // response is not blocked on S3. Falls back to a direct S3 write if the extension
121
+ // is unreachable, so a log is never silently dropped.
122
+ export const getS3LoggerViaExtension = (qpqConfig) => {
123
+ const { bucketName, regionForBucket } = resolveLogTarget(qpqConfig);
124
+ const s3Client = new S3Client({ region: regionForBucket });
125
+ const sendToExtension = async (result) => {
126
+ const res = await fetch(`http://127.0.0.1:${LOG_EXTENSION_PORT}/log`, {
127
+ method: 'POST',
128
+ headers: { 'Content-Type': 'application/json' },
129
+ body: JSON.stringify({
130
+ bucketName,
131
+ region: regionForBucket,
132
+ key: `${result.correlation}.json`,
133
+ body: JSON.stringify(result),
134
+ storageClass: 'INTELLIGENT_TIERING',
135
+ }),
136
+ });
137
+ if (!res.ok) {
138
+ throw new Error(`extension responded ${res.status}`);
139
+ }
140
+ };
141
+ return createBufferedLogger(bucketName, regionForBucket, async (result) => {
142
+ try {
143
+ await sendToExtension(result);
144
+ }
145
+ catch (error) {
146
+ console.log(`qpq-log-extension unreachable, writing [${result.correlation}] to S3 directly:`, error);
147
+ await storyLogger(result, bucketName, s3Client);
148
+ }
149
+ });
150
+ };
151
+ export const getLogger = (qpqConfig) => {
152
+ const awsSettings = getAwsServiceAccountInfoConfig(qpqConfig);
153
+ // If we have no log service, just return nothing.
154
+ if (!awsSettings.logServiceName || awsSettings.disableLogs || process.env.storageDriveName === QPQ_LOGS_STORAGE_DRIVE_NAME) {
155
+ return noopLogger;
156
+ }
157
+ // instantLogs forces the synchronous direct-to-S3 path, bypassing the extension.
158
+ if (awsSettings.instantLogs) {
159
+ return getS3Logger(qpqConfig);
160
+ }
161
+ // Use the off-response-path extension when running inside a real Lambda (where it
162
+ // is always attached); otherwise log directly to S3.
163
+ return process.env.AWS_LAMBDA_RUNTIME_API ? getS3LoggerViaExtension(qpqConfig) : getS3Logger(qpqConfig);
164
+ };
@@ -0,0 +1,2 @@
1
+ import { AssociateSoftwareTokenResult } from 'quidproquo-core';
2
+ export declare const associateSoftwareToken: (region: string, session: string) => Promise<AssociateSoftwareTokenResult>;
@@ -0,0 +1,15 @@
1
+ import { AssociateSoftwareTokenCommand, CognitoIdentityProviderClient } from '@aws-sdk/client-cognito-identity-provider';
2
+ import { createAwsClient } from '../createAwsClient';
3
+ // Begins TOTP enrollment for the MFA_SETUP challenge. Cognito returns the
4
+ // shared secret to seed the authenticator app and a refreshed session that must
5
+ // be used for the subsequent VerifySoftwareToken / RespondToAuthChallenge calls.
6
+ export const associateSoftwareToken = async (region, session) => {
7
+ const cognitoClient = createAwsClient(CognitoIdentityProviderClient, {
8
+ region,
9
+ });
10
+ const response = await cognitoClient.send(new AssociateSoftwareTokenCommand({ Session: session }));
11
+ return {
12
+ secretCode: response.SecretCode || '',
13
+ session: response.Session || '',
14
+ };
15
+ };
@@ -27,7 +27,8 @@ export const decodeValidJwt = async (userPoolId, region, ignoreExpiration, acces
27
27
  return decodedAccessToken;
28
28
  }
29
29
  catch (e) {
30
- console.log('Failed to decode jwt token', e);
30
+ const summary = e instanceof Error ? `${e.name}: ${e.message}` : 'unknown error';
31
+ console.log('Failed to decode jwt token:', summary);
31
32
  return null;
32
33
  }
33
34
  };