@spottoai/types-package 1.0.2-dev1138.1 → 1.0.2-dev1138.12

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 (523) hide show
  1. package/README.md +9 -0
  2. package/dist/accounts/accounts.d.ts +84 -5
  3. package/dist/accounts/accounts.d.ts.map +1 -1
  4. package/dist/accounts/accounts.js +2 -1
  5. package/dist/accounts/accounts.js.map +1 -1
  6. package/dist/accounts/azureManualOnboarding.d.ts +114 -0
  7. package/dist/accounts/azureManualOnboarding.d.ts.map +1 -0
  8. package/dist/accounts/azureManualOnboarding.js +12 -0
  9. package/dist/accounts/azureManualOnboarding.js.map +1 -0
  10. package/dist/accounts/azureSpSetup.d.ts +142 -31
  11. package/dist/accounts/azureSpSetup.d.ts.map +1 -1
  12. package/dist/accounts/azureSpSetup.js +15 -0
  13. package/dist/accounts/azureSpSetup.js.map +1 -1
  14. package/dist/accounts/azureSpSetupDurable.d.ts +8 -0
  15. package/dist/accounts/azureSpSetupDurable.d.ts.map +1 -1
  16. package/dist/accounts/azureSpSetupDurable.js +28 -0
  17. package/dist/accounts/azureSpSetupDurable.js.map +1 -1
  18. package/dist/accounts/index.d.ts +1 -0
  19. package/dist/accounts/index.d.ts.map +1 -1
  20. package/dist/accounts/index.js +1 -0
  21. package/dist/accounts/index.js.map +1 -1
  22. package/dist/accounts/readPermissions.d.ts +1 -1
  23. package/dist/accounts/readPermissions.d.ts.map +1 -1
  24. package/dist/accounts/readPermissions.js.map +1 -1
  25. package/dist/accounts/validation.d.ts +24 -0
  26. package/dist/accounts/validation.d.ts.map +1 -1
  27. package/dist/ai/conversationHistory.d.ts +52 -0
  28. package/dist/ai/conversationHistory.d.ts.map +1 -0
  29. package/dist/ai/conversationHistory.js +10 -0
  30. package/dist/ai/conversationHistory.js.map +1 -0
  31. package/dist/ai/grounding.d.ts +41 -0
  32. package/dist/ai/grounding.d.ts.map +1 -0
  33. package/dist/ai/grounding.js +86 -0
  34. package/dist/ai/grounding.js.map +1 -0
  35. package/dist/ai/index.d.ts +302 -6
  36. package/dist/ai/index.d.ts.map +1 -1
  37. package/dist/ai/index.js +25 -0
  38. package/dist/ai/index.js.map +1 -1
  39. package/dist/ai/workspaceArtifacts.d.ts +587 -0
  40. package/dist/ai/workspaceArtifacts.d.ts.map +1 -0
  41. package/dist/ai/workspaceArtifacts.js +162 -0
  42. package/dist/ai/workspaceArtifacts.js.map +1 -0
  43. package/dist/aws/commitments-planning.d.ts +5 -0
  44. package/dist/aws/commitments-planning.d.ts.map +1 -1
  45. package/dist/aws/commitments-planning.js +19 -0
  46. package/dist/aws/commitments-planning.js.map +1 -1
  47. package/dist/aws/estates.d.ts +1 -1
  48. package/dist/aws/estates.d.ts.map +1 -1
  49. package/dist/aws/estates.js +7 -1
  50. package/dist/aws/estates.js.map +1 -1
  51. package/dist/aws/index.d.ts +5 -0
  52. package/dist/aws/index.d.ts.map +1 -1
  53. package/dist/aws/index.js +5 -0
  54. package/dist/aws/index.js.map +1 -1
  55. package/dist/aws/onboarding.d.ts +3 -0
  56. package/dist/aws/onboarding.d.ts.map +1 -1
  57. package/dist/aws/organizationCommitments.d.ts +260 -0
  58. package/dist/aws/organizationCommitments.d.ts.map +1 -0
  59. package/dist/aws/organizationCommitments.js +53 -0
  60. package/dist/aws/organizationCommitments.js.map +1 -0
  61. package/dist/aws/organizationCommitmentsApiValidation.d.ts +21 -0
  62. package/dist/aws/organizationCommitmentsApiValidation.d.ts.map +1 -0
  63. package/dist/aws/organizationCommitmentsApiValidation.js +226 -0
  64. package/dist/aws/organizationCommitmentsApiValidation.js.map +1 -0
  65. package/dist/aws/organizationCommitmentsValidation.d.ts +12 -0
  66. package/dist/aws/organizationCommitmentsValidation.d.ts.map +1 -0
  67. package/dist/aws/organizationCommitmentsValidation.js +228 -0
  68. package/dist/aws/organizationCommitmentsValidation.js.map +1 -0
  69. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.d.ts +9 -0
  70. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.d.ts.map +1 -0
  71. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.js +407 -0
  72. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.js.map +1 -0
  73. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.d.ts +17 -0
  74. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.d.ts.map +1 -0
  75. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.js +6 -0
  76. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.js.map +1 -0
  77. package/dist/aws/requests.d.ts +13 -2
  78. package/dist/aws/requests.d.ts.map +1 -1
  79. package/dist/aws/requests.js +1 -1
  80. package/dist/aws/requests.js.map +1 -1
  81. package/dist/azure/activityLogAnalysis.d.ts +320 -0
  82. package/dist/azure/activityLogAnalysis.d.ts.map +1 -0
  83. package/dist/azure/activityLogAnalysis.js +70 -0
  84. package/dist/azure/activityLogAnalysis.js.map +1 -0
  85. package/dist/azure/activityLogAnalysisPublicValidation.d.ts +8 -0
  86. package/dist/azure/activityLogAnalysisPublicValidation.d.ts.map +1 -0
  87. package/dist/azure/activityLogAnalysisPublicValidation.js +368 -0
  88. package/dist/azure/activityLogAnalysisPublicValidation.js.map +1 -0
  89. package/dist/azure/activityLogAnalysisPublicValidationHelpers.d.ts +33 -0
  90. package/dist/azure/activityLogAnalysisPublicValidationHelpers.d.ts.map +1 -0
  91. package/dist/azure/activityLogAnalysisPublicValidationHelpers.js +197 -0
  92. package/dist/azure/activityLogAnalysisPublicValidationHelpers.js.map +1 -0
  93. package/dist/azure/activityLogAnalysisValidation.d.ts +5 -0
  94. package/dist/azure/activityLogAnalysisValidation.d.ts.map +1 -0
  95. package/dist/azure/activityLogAnalysisValidation.js +376 -0
  96. package/dist/azure/activityLogAnalysisValidation.js.map +1 -0
  97. package/dist/azure/activityLogs.d.ts +8 -0
  98. package/dist/azure/activityLogs.d.ts.map +1 -1
  99. package/dist/azure/activityLogs.js.map +1 -1
  100. package/dist/azure/benefits.d.ts +1 -1
  101. package/dist/azure/benefits.d.ts.map +1 -1
  102. package/dist/azure/billingPlots.d.ts +7 -1
  103. package/dist/azure/billingPlots.d.ts.map +1 -1
  104. package/dist/azure/billingPlots.js +45 -4
  105. package/dist/azure/billingPlots.js.map +1 -1
  106. package/dist/azure/commitmentsPlanning.d.ts +8 -2
  107. package/dist/azure/commitmentsPlanning.d.ts.map +1 -1
  108. package/dist/azure/common.d.ts +26 -5
  109. package/dist/azure/common.d.ts.map +1 -1
  110. package/dist/azure/common.js +30 -0
  111. package/dist/azure/common.js.map +1 -1
  112. package/dist/azure/costComposition.d.ts +11 -1
  113. package/dist/azure/costComposition.d.ts.map +1 -1
  114. package/dist/azure/costComposition.js +84 -1
  115. package/dist/azure/costComposition.js.map +1 -1
  116. package/dist/azure/dataProtection.d.ts +4 -4
  117. package/dist/azure/dataProtection.d.ts.map +1 -1
  118. package/dist/azure/financialAnalytics.d.ts +80 -8
  119. package/dist/azure/financialAnalytics.d.ts.map +1 -1
  120. package/dist/azure/financialAnalyticsDelivery.d.ts +72 -3
  121. package/dist/azure/financialAnalyticsDelivery.d.ts.map +1 -1
  122. package/dist/azure/financialAnalyticsDelivery.js +7 -1
  123. package/dist/azure/financialAnalyticsDelivery.js.map +1 -1
  124. package/dist/azure/financialAnalyticsDeliveryValidation.d.ts +9 -1
  125. package/dist/azure/financialAnalyticsDeliveryValidation.d.ts.map +1 -1
  126. package/dist/azure/financialAnalyticsDeliveryValidation.js +190 -10
  127. package/dist/azure/financialAnalyticsDeliveryValidation.js.map +1 -1
  128. package/dist/azure/financialAnalyticsDisplayKernel.d.ts +12 -0
  129. package/dist/azure/financialAnalyticsDisplayKernel.d.ts.map +1 -0
  130. package/dist/azure/financialAnalyticsDisplayKernel.js +144 -0
  131. package/dist/azure/financialAnalyticsDisplayKernel.js.map +1 -0
  132. package/dist/azure/financialAnalyticsValidation.d.ts.map +1 -1
  133. package/dist/azure/financialAnalyticsValidation.js +101 -19
  134. package/dist/azure/financialAnalyticsValidation.js.map +1 -1
  135. package/dist/azure/financialAuthorityProjectionKernel.d.ts +8 -0
  136. package/dist/azure/financialAuthorityProjectionKernel.d.ts.map +1 -0
  137. package/dist/azure/financialAuthorityProjectionKernel.js +269 -0
  138. package/dist/azure/financialAuthorityProjectionKernel.js.map +1 -0
  139. package/dist/azure/financialAuthorityView.d.ts +13 -0
  140. package/dist/azure/financialAuthorityView.d.ts.map +1 -1
  141. package/dist/azure/financialAuthorityView.js.map +1 -1
  142. package/dist/azure/financialAuthorityViewValidation.d.ts +3 -1
  143. package/dist/azure/financialAuthorityViewValidation.d.ts.map +1 -1
  144. package/dist/azure/financialAuthorityViewValidation.js +273 -2
  145. package/dist/azure/financialAuthorityViewValidation.js.map +1 -1
  146. package/dist/azure/financialChargeComposition.d.ts +81 -0
  147. package/dist/azure/financialChargeComposition.d.ts.map +1 -0
  148. package/dist/azure/financialChargeComposition.js +41 -0
  149. package/dist/azure/financialChargeComposition.js.map +1 -0
  150. package/dist/azure/financialChargeCompositionKernel.d.ts +3 -0
  151. package/dist/azure/financialChargeCompositionKernel.d.ts.map +1 -0
  152. package/dist/azure/financialChargeCompositionKernel.js +53 -0
  153. package/dist/azure/financialChargeCompositionKernel.js.map +1 -0
  154. package/dist/azure/financialChargeCompositionValidation.d.ts +8 -0
  155. package/dist/azure/financialChargeCompositionValidation.d.ts.map +1 -0
  156. package/dist/azure/financialChargeCompositionValidation.js +164 -0
  157. package/dist/azure/financialChargeCompositionValidation.js.map +1 -0
  158. package/dist/azure/financialChargePolicy.d.ts +215 -0
  159. package/dist/azure/financialChargePolicy.d.ts.map +1 -0
  160. package/dist/azure/financialChargePolicy.js +488 -0
  161. package/dist/azure/financialChargePolicy.js.map +1 -0
  162. package/dist/azure/financialCurrentSpendSurfaceProjection.d.ts +76 -0
  163. package/dist/azure/financialCurrentSpendSurfaceProjection.d.ts.map +1 -0
  164. package/dist/azure/financialCurrentSpendSurfaceProjection.js +6 -0
  165. package/dist/azure/financialCurrentSpendSurfaceProjection.js.map +1 -0
  166. package/dist/azure/financialCurrentSpendSurfaceProjectionValidation.d.ts +10 -0
  167. package/dist/azure/financialCurrentSpendSurfaceProjectionValidation.d.ts.map +1 -0
  168. package/dist/azure/financialCurrentSpendSurfaceProjectionValidation.js +196 -0
  169. package/dist/azure/financialCurrentSpendSurfaceProjectionValidation.js.map +1 -0
  170. package/dist/azure/financialDataflow.d.ts +45 -2
  171. package/dist/azure/financialDataflow.d.ts.map +1 -1
  172. package/dist/azure/financialDataflow.js.map +1 -1
  173. package/dist/azure/financialDataflowKernel.d.ts +31 -0
  174. package/dist/azure/financialDataflowKernel.d.ts.map +1 -0
  175. package/dist/azure/financialDataflowKernel.js +170 -0
  176. package/dist/azure/financialDataflowKernel.js.map +1 -0
  177. package/dist/azure/financialDataflowValidation.d.ts +5 -2
  178. package/dist/azure/financialDataflowValidation.d.ts.map +1 -1
  179. package/dist/azure/financialDataflowValidation.js +203 -30
  180. package/dist/azure/financialDataflowValidation.js.map +1 -1
  181. package/dist/azure/financialEvidenceAssessmentValidation.d.ts.map +1 -1
  182. package/dist/azure/financialEvidenceAssessmentValidation.js +7 -0
  183. package/dist/azure/financialEvidenceAssessmentValidation.js.map +1 -1
  184. package/dist/azure/financialEvidenceCoverage.d.ts +36 -0
  185. package/dist/azure/financialEvidenceCoverage.d.ts.map +1 -0
  186. package/dist/azure/financialEvidenceCoverage.js +111 -0
  187. package/dist/azure/financialEvidenceCoverage.js.map +1 -0
  188. package/dist/azure/financialPolicy.d.ts +19 -3
  189. package/dist/azure/financialPolicy.d.ts.map +1 -1
  190. package/dist/azure/financialPolicy.js.map +1 -1
  191. package/dist/azure/financialPolicyDelivery.d.ts +75 -1
  192. package/dist/azure/financialPolicyDelivery.d.ts.map +1 -1
  193. package/dist/azure/financialPolicyDelivery.js +5 -1
  194. package/dist/azure/financialPolicyDelivery.js.map +1 -1
  195. package/dist/azure/financialPolicyDeliveryValidation.d.ts +16 -2
  196. package/dist/azure/financialPolicyDeliveryValidation.d.ts.map +1 -1
  197. package/dist/azure/financialPolicyDeliveryValidation.js +238 -5
  198. package/dist/azure/financialPolicyDeliveryValidation.js.map +1 -1
  199. package/dist/azure/financialPolicyKernel.d.ts +38 -0
  200. package/dist/azure/financialPolicyKernel.d.ts.map +1 -0
  201. package/dist/azure/financialPolicyKernel.js +232 -0
  202. package/dist/azure/financialPolicyKernel.js.map +1 -0
  203. package/dist/azure/financialPolicyValidation.d.ts +1 -0
  204. package/dist/azure/financialPolicyValidation.d.ts.map +1 -1
  205. package/dist/azure/financialPolicyValidation.js +111 -16
  206. package/dist/azure/financialPolicyValidation.js.map +1 -1
  207. package/dist/azure/financialProjection.d.ts +11 -1
  208. package/dist/azure/financialProjection.d.ts.map +1 -1
  209. package/dist/azure/financialProjection.js.map +1 -1
  210. package/dist/azure/financialProjectionValidation.d.ts.map +1 -1
  211. package/dist/azure/financialProjectionValidation.js +43 -3
  212. package/dist/azure/financialProjectionValidation.js.map +1 -1
  213. package/dist/azure/financialResourceSurfaceProjection.d.ts +66 -0
  214. package/dist/azure/financialResourceSurfaceProjection.d.ts.map +1 -0
  215. package/dist/azure/financialResourceSurfaceProjection.js +6 -0
  216. package/dist/azure/financialResourceSurfaceProjection.js.map +1 -0
  217. package/dist/azure/financialResourceSurfaceProjectionValidation.d.ts +16 -0
  218. package/dist/azure/financialResourceSurfaceProjectionValidation.d.ts.map +1 -0
  219. package/dist/azure/financialResourceSurfaceProjectionValidation.js +252 -0
  220. package/dist/azure/financialResourceSurfaceProjectionValidation.js.map +1 -0
  221. package/dist/azure/financialSavingsAuthority.d.ts +68 -4
  222. package/dist/azure/financialSavingsAuthority.d.ts.map +1 -1
  223. package/dist/azure/financialSavingsAuthority.js +2 -1
  224. package/dist/azure/financialSavingsAuthority.js.map +1 -1
  225. package/dist/azure/financialSavingsAuthorityValidation.d.ts +6 -2
  226. package/dist/azure/financialSavingsAuthorityValidation.d.ts.map +1 -1
  227. package/dist/azure/financialSavingsAuthorityValidation.js +188 -2
  228. package/dist/azure/financialSavingsAuthorityValidation.js.map +1 -1
  229. package/dist/azure/financialSavingsChargePolicyKernel.d.ts +12 -0
  230. package/dist/azure/financialSavingsChargePolicyKernel.d.ts.map +1 -0
  231. package/dist/azure/financialSavingsChargePolicyKernel.js +34 -0
  232. package/dist/azure/financialSavingsChargePolicyKernel.js.map +1 -0
  233. package/dist/azure/financialSavingsCoordinateValidation.d.ts.map +1 -1
  234. package/dist/azure/financialSavingsCoordinateValidation.js +98 -19
  235. package/dist/azure/financialSavingsCoordinateValidation.js.map +1 -1
  236. package/dist/azure/financialSavingsPercentageKernel.d.ts +20 -0
  237. package/dist/azure/financialSavingsPercentageKernel.d.ts.map +1 -0
  238. package/dist/azure/financialSavingsPercentageKernel.js +49 -0
  239. package/dist/azure/financialSavingsPercentageKernel.js.map +1 -0
  240. package/dist/azure/financialSavingsSurfaceProjection.d.ts +82 -3
  241. package/dist/azure/financialSavingsSurfaceProjection.d.ts.map +1 -1
  242. package/dist/azure/financialSavingsSurfaceProjection.js +3 -1
  243. package/dist/azure/financialSavingsSurfaceProjection.js.map +1 -1
  244. package/dist/azure/financialSavingsSurfaceProjectionKernel.d.ts +26 -0
  245. package/dist/azure/financialSavingsSurfaceProjectionKernel.d.ts.map +1 -0
  246. package/dist/azure/financialSavingsSurfaceProjectionKernel.js +435 -0
  247. package/dist/azure/financialSavingsSurfaceProjectionKernel.js.map +1 -0
  248. package/dist/azure/financialSavingsSurfaceProjectionValidation.d.ts.map +1 -1
  249. package/dist/azure/financialSavingsSurfaceProjectionValidation.js +199 -13
  250. package/dist/azure/financialSavingsSurfaceProjectionValidation.js.map +1 -1
  251. package/dist/azure/financialScope.d.ts +14 -0
  252. package/dist/azure/financialScope.d.ts.map +1 -1
  253. package/dist/azure/financialScope.js +14 -0
  254. package/dist/azure/financialScope.js.map +1 -1
  255. package/dist/azure/financialScopeBaseline.d.ts +11 -3
  256. package/dist/azure/financialScopeBaseline.d.ts.map +1 -1
  257. package/dist/azure/financialScopeBaseline.js +14 -1
  258. package/dist/azure/financialScopeBaseline.js.map +1 -1
  259. package/dist/azure/financialScopeBaselineIdentity.d.ts.map +1 -1
  260. package/dist/azure/financialScopeBaselineIdentity.js +24 -4
  261. package/dist/azure/financialScopeBaselineIdentity.js.map +1 -1
  262. package/dist/azure/financialScopeBaselineValidation.d.ts.map +1 -1
  263. package/dist/azure/financialScopeBaselineValidation.js +21 -4
  264. package/dist/azure/financialScopeBaselineValidation.js.map +1 -1
  265. package/dist/azure/financialScopeEvidence.d.ts +1 -1
  266. package/dist/azure/financialScopeEvidence.d.ts.map +1 -1
  267. package/dist/azure/governance.d.ts +145 -0
  268. package/dist/azure/governance.d.ts.map +1 -1
  269. package/dist/azure/governance.js +2 -1
  270. package/dist/azure/governance.js.map +1 -1
  271. package/dist/azure/metrics.d.ts +2 -2
  272. package/dist/azure/metrics.d.ts.map +1 -1
  273. package/dist/azure/payloads.d.ts +55 -1
  274. package/dist/azure/payloads.d.ts.map +1 -1
  275. package/dist/azure/prices.d.ts +41 -12
  276. package/dist/azure/prices.d.ts.map +1 -1
  277. package/dist/azure/recommendationLifecycleOverlayValidation.d.ts +5 -0
  278. package/dist/azure/recommendationLifecycleOverlayValidation.d.ts.map +1 -0
  279. package/dist/azure/recommendationLifecycleOverlayValidation.js +82 -0
  280. package/dist/azure/recommendationLifecycleOverlayValidation.js.map +1 -0
  281. package/dist/azure/recommendationState.d.ts +1 -1
  282. package/dist/azure/recommendationState.d.ts.map +1 -1
  283. package/dist/azure/recommendations.d.ts +141 -5
  284. package/dist/azure/recommendations.d.ts.map +1 -1
  285. package/dist/azure/recommendations.js +3 -1
  286. package/dist/azure/recommendations.js.map +1 -1
  287. package/dist/azure/relationships.d.ts +1 -1
  288. package/dist/azure/relationships.d.ts.map +1 -1
  289. package/dist/azure/reportDailySpend.d.ts +48 -0
  290. package/dist/azure/reportDailySpend.d.ts.map +1 -0
  291. package/dist/azure/reportDailySpend.js +6 -0
  292. package/dist/azure/reportDailySpend.js.map +1 -0
  293. package/dist/azure/reportDailySpendValidation.d.ts +3 -0
  294. package/dist/azure/reportDailySpendValidation.d.ts.map +1 -0
  295. package/dist/azure/reportDailySpendValidation.js +72 -0
  296. package/dist/azure/reportDailySpendValidation.js.map +1 -0
  297. package/dist/azure/reportEvidence.d.ts +615 -0
  298. package/dist/azure/reportEvidence.d.ts.map +1 -0
  299. package/dist/azure/reportEvidence.js +25 -0
  300. package/dist/azure/reportEvidence.js.map +1 -0
  301. package/dist/azure/reportEvidenceCatalogueValidation.d.ts +5 -0
  302. package/dist/azure/reportEvidenceCatalogueValidation.d.ts.map +1 -0
  303. package/dist/azure/reportEvidenceCatalogueValidation.js +109 -0
  304. package/dist/azure/reportEvidenceCatalogueValidation.js.map +1 -0
  305. package/dist/azure/reportEvidenceValidation.d.ts +7 -0
  306. package/dist/azure/reportEvidenceValidation.d.ts.map +1 -0
  307. package/dist/azure/reportEvidenceValidation.js +421 -0
  308. package/dist/azure/reportEvidenceValidation.js.map +1 -0
  309. package/dist/azure/reportEvidenceValidationHelpers.d.ts +27 -0
  310. package/dist/azure/reportEvidenceValidationHelpers.d.ts.map +1 -0
  311. package/dist/azure/reportEvidenceValidationHelpers.js +134 -0
  312. package/dist/azure/reportEvidenceValidationHelpers.js.map +1 -0
  313. package/dist/azure/reportSavingsContributionValidation.d.ts +5 -0
  314. package/dist/azure/reportSavingsContributionValidation.d.ts.map +1 -0
  315. package/dist/azure/reportSavingsContributionValidation.js +37 -0
  316. package/dist/azure/reportSavingsContributionValidation.js.map +1 -0
  317. package/dist/azure/reportSpend.d.ts +87 -0
  318. package/dist/azure/reportSpend.d.ts.map +1 -0
  319. package/dist/azure/reportSpend.js +5 -0
  320. package/dist/azure/reportSpend.js.map +1 -0
  321. package/dist/azure/reportSpendValidation.d.ts +7 -0
  322. package/dist/azure/reportSpendValidation.d.ts.map +1 -0
  323. package/dist/azure/reportSpendValidation.js +197 -0
  324. package/dist/azure/reportSpendValidation.js.map +1 -0
  325. package/dist/azure/reportSpendValidationHelpers.d.ts +7 -0
  326. package/dist/azure/reportSpendValidationHelpers.d.ts.map +1 -0
  327. package/dist/azure/reportSpendValidationHelpers.js +31 -0
  328. package/dist/azure/reportSpendValidationHelpers.js.map +1 -0
  329. package/dist/azure/reports.d.ts +32 -10
  330. package/dist/azure/reports.d.ts.map +1 -1
  331. package/dist/azure/reports.js.map +1 -1
  332. package/dist/azure/resources.d.ts +24 -12
  333. package/dist/azure/resources.d.ts.map +1 -1
  334. package/dist/azure/serviceRetirement.d.ts +33 -2
  335. package/dist/azure/serviceRetirement.d.ts.map +1 -1
  336. package/dist/azure/storage-inventory.d.ts +44 -0
  337. package/dist/azure/storage-inventory.d.ts.map +1 -1
  338. package/dist/azure/subscriptions.d.ts +57 -11
  339. package/dist/azure/subscriptions.d.ts.map +1 -1
  340. package/dist/azure/subscriptions.js +35 -0
  341. package/dist/azure/subscriptions.js.map +1 -1
  342. package/dist/azure/views.d.ts +86 -22
  343. package/dist/azure/views.d.ts.map +1 -1
  344. package/dist/azure/views.js +8 -1
  345. package/dist/azure/views.js.map +1 -1
  346. package/dist/azure/vmPatchManagement.d.ts +109 -0
  347. package/dist/azure/vmPatchManagement.d.ts.map +1 -0
  348. package/dist/azure/vmPatchManagement.js +7 -0
  349. package/dist/azure/vmPatchManagement.js.map +1 -0
  350. package/dist/common/provider.d.ts +53 -0
  351. package/dist/common/provider.d.ts.map +1 -1
  352. package/dist/common/provider.js.map +1 -1
  353. package/dist/company/company.d.ts +1 -0
  354. package/dist/company/company.d.ts.map +1 -1
  355. package/dist/environment/canonicalization.d.ts +12 -0
  356. package/dist/environment/canonicalization.d.ts.map +1 -0
  357. package/dist/environment/canonicalization.js +40 -0
  358. package/dist/environment/canonicalization.js.map +1 -0
  359. package/dist/environment/contracts.d.ts +472 -0
  360. package/dist/environment/contracts.d.ts.map +1 -0
  361. package/dist/environment/contracts.js +73 -0
  362. package/dist/environment/contracts.js.map +1 -0
  363. package/dist/environment/index.d.ts +6 -0
  364. package/dist/environment/index.d.ts.map +1 -0
  365. package/dist/environment/index.js +22 -0
  366. package/dist/environment/index.js.map +1 -0
  367. package/dist/environment/internal.d.ts +21 -0
  368. package/dist/environment/internal.d.ts.map +1 -0
  369. package/dist/environment/internal.js +113 -0
  370. package/dist/environment/internal.js.map +1 -0
  371. package/dist/environment/references.d.ts +24 -0
  372. package/dist/environment/references.d.ts.map +1 -0
  373. package/dist/environment/references.js +243 -0
  374. package/dist/environment/references.js.map +1 -0
  375. package/dist/environment/tenant.d.ts +128 -0
  376. package/dist/environment/tenant.d.ts.map +1 -0
  377. package/dist/environment/tenant.js +203 -0
  378. package/dist/environment/tenant.js.map +1 -0
  379. package/dist/environment/validation.d.ts +34 -0
  380. package/dist/environment/validation.d.ts.map +1 -0
  381. package/dist/environment/validation.js +655 -0
  382. package/dist/environment/validation.js.map +1 -0
  383. package/dist/esm/accounts/accounts.js +1 -0
  384. package/dist/esm/accounts/azureManualOnboarding.js +8 -0
  385. package/dist/esm/accounts/azureSpSetup.js +14 -1
  386. package/dist/esm/accounts/azureSpSetupDurable.js +27 -1
  387. package/dist/esm/accounts/index.js +1 -0
  388. package/dist/esm/ai/conversationHistory.js +6 -0
  389. package/dist/esm/ai/grounding.js +80 -0
  390. package/dist/esm/ai/index.js +10 -1
  391. package/dist/esm/ai/workspaceArtifacts.js +158 -0
  392. package/dist/esm/aws/commitments-planning.js +5 -0
  393. package/dist/esm/aws/estates.js +7 -1
  394. package/dist/esm/aws/index.js +5 -0
  395. package/dist/esm/aws/organizationCommitments.js +48 -0
  396. package/dist/esm/aws/organizationCommitmentsApiValidation.js +220 -0
  397. package/dist/esm/aws/organizationCommitmentsValidation.js +224 -0
  398. package/dist/esm/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.js +402 -0
  399. package/dist/esm/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.js +2 -0
  400. package/dist/esm/aws/requests.js +1 -1
  401. package/dist/esm/azure/activityLogAnalysis.js +64 -0
  402. package/dist/esm/azure/activityLogAnalysisPublicValidation.js +360 -0
  403. package/dist/esm/azure/activityLogAnalysisPublicValidationHelpers.js +172 -0
  404. package/dist/esm/azure/activityLogAnalysisValidation.js +365 -0
  405. package/dist/esm/azure/billingPlots.js +45 -4
  406. package/dist/esm/azure/common.js +28 -1
  407. package/dist/esm/azure/costComposition.js +80 -0
  408. package/dist/esm/azure/financialAnalyticsDelivery.js +5 -0
  409. package/dist/esm/azure/financialAnalyticsDeliveryValidation.js +184 -11
  410. package/dist/esm/azure/financialAnalyticsDisplayKernel.js +139 -0
  411. package/dist/esm/azure/financialAnalyticsValidation.js +101 -19
  412. package/dist/esm/azure/financialAuthorityProjectionKernel.js +263 -0
  413. package/dist/esm/azure/financialAuthorityViewValidation.js +271 -1
  414. package/dist/esm/azure/financialChargeComposition.js +36 -0
  415. package/dist/esm/azure/financialChargeCompositionKernel.js +48 -0
  416. package/dist/esm/azure/financialChargeCompositionValidation.js +155 -0
  417. package/dist/esm/azure/financialChargePolicy.js +473 -0
  418. package/dist/esm/azure/financialCurrentSpendSurfaceProjection.js +2 -0
  419. package/dist/esm/azure/financialCurrentSpendSurfaceProjectionValidation.js +184 -0
  420. package/dist/esm/azure/financialDataflowKernel.js +164 -0
  421. package/dist/esm/azure/financialDataflowValidation.js +199 -29
  422. package/dist/esm/azure/financialEvidenceAssessmentValidation.js +7 -0
  423. package/dist/esm/azure/financialEvidenceCoverage.js +106 -0
  424. package/dist/esm/azure/financialPolicyDelivery.js +4 -0
  425. package/dist/esm/azure/financialPolicyDeliveryValidation.js +227 -7
  426. package/dist/esm/azure/financialPolicyKernel.js +225 -0
  427. package/dist/esm/azure/financialPolicyValidation.js +110 -16
  428. package/dist/esm/azure/financialProjectionValidation.js +43 -3
  429. package/dist/esm/azure/financialResourceSurfaceProjection.js +2 -0
  430. package/dist/esm/azure/financialResourceSurfaceProjectionValidation.js +243 -0
  431. package/dist/esm/azure/financialSavingsAuthority.js +1 -0
  432. package/dist/esm/azure/financialSavingsAuthorityValidation.js +186 -2
  433. package/dist/esm/azure/financialSavingsChargePolicyKernel.js +29 -0
  434. package/dist/esm/azure/financialSavingsCoordinateValidation.js +98 -19
  435. package/dist/esm/azure/financialSavingsPercentageKernel.js +44 -0
  436. package/dist/esm/azure/financialSavingsSurfaceProjection.js +2 -0
  437. package/dist/esm/azure/financialSavingsSurfaceProjectionKernel.js +427 -0
  438. package/dist/esm/azure/financialSavingsSurfaceProjectionValidation.js +199 -13
  439. package/dist/esm/azure/financialScope.js +14 -0
  440. package/dist/esm/azure/financialScopeBaseline.js +12 -0
  441. package/dist/esm/azure/financialScopeBaselineIdentity.js +24 -4
  442. package/dist/esm/azure/financialScopeBaselineValidation.js +21 -4
  443. package/dist/esm/azure/governance.js +1 -0
  444. package/dist/esm/azure/recommendationLifecycleOverlayValidation.js +75 -0
  445. package/dist/esm/azure/recommendations.js +2 -0
  446. package/dist/esm/azure/reportDailySpend.js +2 -0
  447. package/dist/esm/azure/reportDailySpendValidation.js +67 -0
  448. package/dist/esm/azure/reportEvidence.js +21 -0
  449. package/dist/esm/azure/reportEvidenceCatalogueValidation.js +103 -0
  450. package/dist/esm/azure/reportEvidenceValidation.js +413 -0
  451. package/dist/esm/azure/reportEvidenceValidationHelpers.js +106 -0
  452. package/dist/esm/azure/reportSavingsContributionValidation.js +30 -0
  453. package/dist/esm/azure/reportSpend.js +1 -0
  454. package/dist/esm/azure/reportSpendValidation.js +189 -0
  455. package/dist/esm/azure/reportSpendValidationHelpers.js +22 -0
  456. package/dist/esm/azure/subscriptions.js +33 -1
  457. package/dist/esm/azure/views.js +8 -1
  458. package/dist/esm/azure/vmPatchManagement.js +3 -0
  459. package/dist/esm/entries/commitments-planning.js +2 -2
  460. package/dist/esm/entries/environment.js +3 -0
  461. package/dist/esm/environment/canonicalization.js +34 -0
  462. package/dist/esm/environment/contracts.js +69 -0
  463. package/dist/esm/environment/index.js +5 -0
  464. package/dist/esm/environment/internal.js +97 -0
  465. package/dist/esm/environment/references.js +230 -0
  466. package/dist/esm/environment/tenant.js +190 -0
  467. package/dist/esm/environment/validation.js +635 -0
  468. package/dist/esm/identity/index.js +1 -0
  469. package/dist/esm/identity/microsoftSignInAdminConsent.js +1 -0
  470. package/dist/esm/index.js +13 -0
  471. package/dist/esm/index.vite.js +11 -0
  472. package/dist/esm/scheduler/bastionSchedule.js +1 -0
  473. package/dist/esm/scheduler/bastionScheduleProfile.js +206 -0
  474. package/dist/esm/scheduler/bastionScheduleValidation.js +401 -0
  475. package/dist/esm/scheduler/index.js +3 -0
  476. package/dist/events/alertDefinitionRun.d.ts +4 -0
  477. package/dist/events/alertDefinitionRun.d.ts.map +1 -1
  478. package/dist/events/baseAlert.d.ts +1 -0
  479. package/dist/events/baseAlert.d.ts.map +1 -1
  480. package/dist/events/cost.d.ts +4 -0
  481. package/dist/events/cost.d.ts.map +1 -1
  482. package/dist/events/quickAlerts.d.ts +13 -4
  483. package/dist/events/quickAlerts.d.ts.map +1 -1
  484. package/dist/events/quickAlerts.js.map +1 -1
  485. package/dist/features-and-permissions/access.d.ts +79 -0
  486. package/dist/features-and-permissions/access.d.ts.map +1 -1
  487. package/dist/identity/index.d.ts +1 -0
  488. package/dist/identity/index.d.ts.map +1 -1
  489. package/dist/identity/index.js +1 -0
  490. package/dist/identity/index.js.map +1 -1
  491. package/dist/identity/microsoftSignInAdminConsent.d.ts +59 -0
  492. package/dist/identity/microsoftSignInAdminConsent.d.ts.map +1 -0
  493. package/dist/identity/microsoftSignInAdminConsent.js +3 -0
  494. package/dist/identity/microsoftSignInAdminConsent.js.map +1 -0
  495. package/dist/index.d.ts +13 -0
  496. package/dist/index.d.ts.map +1 -1
  497. package/dist/index.js +19 -0
  498. package/dist/index.js.map +1 -1
  499. package/dist/index.vite.d.ts +11 -0
  500. package/dist/index.vite.d.ts.map +1 -1
  501. package/dist/index.vite.js +15 -0
  502. package/dist/index.vite.js.map +1 -1
  503. package/dist/portfolio/portfolioOperations.d.ts +1 -1
  504. package/dist/portfolio/portfolioOperations.d.ts.map +1 -1
  505. package/dist/scheduler/bastionSchedule.d.ts +113 -0
  506. package/dist/scheduler/bastionSchedule.d.ts.map +1 -0
  507. package/dist/scheduler/bastionSchedule.js +3 -0
  508. package/dist/scheduler/bastionSchedule.js.map +1 -0
  509. package/dist/scheduler/bastionScheduleProfile.d.ts +24 -0
  510. package/dist/scheduler/bastionScheduleProfile.d.ts.map +1 -0
  511. package/dist/scheduler/bastionScheduleProfile.js +210 -0
  512. package/dist/scheduler/bastionScheduleProfile.js.map +1 -0
  513. package/dist/scheduler/bastionScheduleValidation.d.ts +10 -0
  514. package/dist/scheduler/bastionScheduleValidation.d.ts.map +1 -0
  515. package/dist/scheduler/bastionScheduleValidation.js +412 -0
  516. package/dist/scheduler/bastionScheduleValidation.js.map +1 -0
  517. package/dist/scheduler/index.d.ts +3 -0
  518. package/dist/scheduler/index.d.ts.map +1 -1
  519. package/dist/scheduler/index.js +3 -0
  520. package/dist/scheduler/index.js.map +1 -1
  521. package/dist/scheduler/scheduler.d.ts +14 -10
  522. package/dist/scheduler/scheduler.d.ts.map +1 -1
  523. package/package.json +20 -3
@@ -0,0 +1,263 @@
1
+ import { FINANCIAL_AUTHORITY_RESOURCE_PROJECTION_CONTRACT_VERSION_V1, } from './financialAuthorityView.js';
2
+ import { FINANCIAL_SAVINGS_RESOURCE_PROJECTION_CONTRACT_VERSION_V1, } from './financialSavingsAuthority.js';
3
+ import { AZURE_BILLED_ALL_CHARGES_POLICY_V1, resolveFinancialChargeInclusionPolicyV1, } from './financialChargeComposition.js';
4
+ import { classifyFinancialSavingsAllocationForPolicyV1 } from './financialSavingsChargePolicyKernel.js';
5
+ const normalize = (value) => value.trim().toLowerCase().replace(/\/+$/, '');
6
+ /** Derives one compact, non-additive resource view from a validated canonical authority. */
7
+ export const projectFinancialAuthorityResourceV1 = (authority, resourceType, scopeId) => {
8
+ const normalizedType = normalize(resourceType);
9
+ const normalizedScopeId = normalize(scopeId);
10
+ const coverage = authority.scopeCoverage.find(entry => normalize(entry.resourceType) === normalizedType && entry.scopeIds.some(candidate => normalize(candidate) === normalizedScopeId));
11
+ if (!coverage)
12
+ return undefined;
13
+ const coordinates = authority.coordinates.map(coordinate => {
14
+ const owners = coordinate.ownerBaselines.filter(baseline => normalize(baseline.scopeId) === normalizedScopeId);
15
+ const ownerBaseline = owners[0];
16
+ if (owners.length !== 1 || !ownerBaseline)
17
+ throw new TypeError('Financial authority resource owner is missing or ambiguous.');
18
+ const chargeComposition = ownerBaseline.status === 'available' && ownerBaseline.baselineKind === 'owner'
19
+ ? coordinate.chargeCompositions.find(composition => composition.baselineId === ownerBaseline.baselineId)
20
+ : undefined;
21
+ if (ownerBaseline.status === 'available' && ownerBaseline.baselineKind === 'owner' && !chargeComposition) {
22
+ throw new TypeError('Financial authority resource charge composition is missing.');
23
+ }
24
+ const displayRollups = (coordinate.displayRollups ?? []).filter(rollup => normalize(rollup.displayScopeId) === normalizedScopeId);
25
+ const displayMemberBaselineIds = new Set(displayRollups.flatMap(rollup => rollup.members.map(member => member.baselineId)).filter(baselineId => baselineId !== ownerBaseline.baselineId));
26
+ const displayMemberBaselines = coordinate.ownerBaselines.filter(baseline => baseline.status === 'available' &&
27
+ baseline.baselineKind === 'owner' &&
28
+ displayMemberBaselineIds.has(baseline.baselineId));
29
+ if (displayMemberBaselines.length !== displayMemberBaselineIds.size) {
30
+ throw new TypeError('Financial authority resource display member baseline is missing.');
31
+ }
32
+ const displayMemberChargeCompositions = (coordinate.chargeCompositions ?? []).filter(composition => displayMemberBaselineIds.has(composition.baselineId));
33
+ if (displayMemberBaselines.some(baseline => baseline.status === 'available' &&
34
+ baseline.baselineKind === 'owner' &&
35
+ !displayMemberChargeCompositions.some(composition => composition.baselineId === baseline.baselineId))) {
36
+ throw new TypeError('Financial authority resource display member charge composition is missing.');
37
+ }
38
+ const displayMemberships = new Set(displayRollups.flatMap(rollup => rollup.members.map(member => `${member.baselineId}\u0000${member.componentId}`)));
39
+ return {
40
+ coordinateId: coordinate.coordinateId,
41
+ periodRole: coordinate.periodRole,
42
+ period: coordinate.period,
43
+ costBasis: coordinate.costBasis,
44
+ estimateLens: coordinate.estimateLens,
45
+ ...(coordinate.requestedCurrencyCode === undefined ? {} : { requestedCurrencyCode: coordinate.requestedCurrencyCode }),
46
+ ownerBaseline,
47
+ ...(displayMemberBaselines.length === 0 ? {} : { displayMemberBaselines }),
48
+ ...(chargeComposition === undefined ? {} : { chargeComposition }),
49
+ ...(displayMemberChargeCompositions.length === 0 ? {} : { displayMemberChargeCompositions }),
50
+ componentDescriptors: (coordinate.componentDescriptors ?? []).filter(descriptor => displayMemberships.has(`${descriptor.baselineId}\u0000${descriptor.componentId}`)),
51
+ displayRollups,
52
+ projections: coordinate.projections.filter(projection => normalize(projection.scopeId) === normalizedScopeId),
53
+ };
54
+ });
55
+ const firstCoordinate = coordinates[0];
56
+ if (!firstCoordinate)
57
+ throw new TypeError('Financial authority resource projection has no coordinates.');
58
+ const assessmentIds = new Set();
59
+ const bundleIds = new Set();
60
+ coordinates.forEach(coordinate => {
61
+ assessmentIds.add(coordinate.ownerBaseline.assessmentId);
62
+ if (coordinate.ownerBaseline.status === 'available' && coordinate.ownerBaseline.baselineKind === 'owner') {
63
+ bundleIds.add(coordinate.ownerBaseline.evidenceBundleId);
64
+ }
65
+ for (const baseline of coordinate.displayMemberBaselines ?? []) {
66
+ assessmentIds.add(baseline.assessmentId);
67
+ if (baseline.status === 'available' && baseline.baselineKind === 'owner')
68
+ bundleIds.add(baseline.evidenceBundleId);
69
+ }
70
+ coordinate.projections.forEach(projection => {
71
+ if (projection.targetAssessmentId)
72
+ assessmentIds.add(projection.targetAssessmentId);
73
+ if (projection.targetEvidenceBundleId)
74
+ bundleIds.add(projection.targetEvidenceBundleId);
75
+ });
76
+ });
77
+ const evidenceAssessments = authority.evidenceAssessments.filter(assessment => assessmentIds.has(assessment.assessmentId));
78
+ evidenceAssessments.forEach(assessment => {
79
+ if (assessment.evidenceBundleId)
80
+ bundleIds.add(assessment.evidenceBundleId);
81
+ });
82
+ return {
83
+ contractVersion: FINANCIAL_AUTHORITY_RESOURCE_PROJECTION_CONTRACT_VERSION_V1,
84
+ authorityId: authority.authorityId,
85
+ provider: authority.provider,
86
+ providerAccountRefs: authority.providerAccountRefs,
87
+ artifactGeneration: authority.artifactGeneration,
88
+ billingGenerationId: authority.billingGenerationId,
89
+ resourceType: coverage.resourceType,
90
+ financialRole: coverage.financialRole,
91
+ scopeId: normalizedScopeId,
92
+ evidenceBundles: authority.evidenceBundles.filter(bundle => bundleIds.has(bundle.bundleId)),
93
+ evidenceAssessments,
94
+ coordinates: [firstCoordinate, ...coordinates.slice(1)],
95
+ };
96
+ };
97
+ /** Derives the matching compact savings view for one canonical resource owner. */
98
+ export const projectFinancialSavingsResourceV1 = (savingsAuthority, financialProjection, financialAuthority, chargeInclusionPolicyRef = AZURE_BILLED_ALL_CHARGES_POLICY_V1.policyRef) => {
99
+ if (savingsAuthority.financialAuthorityId !== financialProjection.authorityId ||
100
+ savingsAuthority.artifactGeneration.runId !== financialProjection.artifactGeneration.runId ||
101
+ savingsAuthority.artifactGeneration.generatedAt !== financialProjection.artifactGeneration.generatedAt) {
102
+ throw new TypeError('Financial savings authority is not bound to the resource Financial Authority projection.');
103
+ }
104
+ if (!resolveFinancialChargeInclusionPolicyV1(chargeInclusionPolicyRef)) {
105
+ throw new TypeError('Financial savings resource charge-inclusion policy is not registered.');
106
+ }
107
+ if (financialAuthority !== undefined &&
108
+ (financialAuthority.authorityId !== financialProjection.authorityId ||
109
+ financialAuthority.artifactGeneration.runId !== financialProjection.artifactGeneration.runId ||
110
+ financialAuthority.artifactGeneration.generatedAt !== financialProjection.artifactGeneration.generatedAt)) {
111
+ throw new TypeError('Full Financial Authority is not bound to the resource projection.');
112
+ }
113
+ const normalizedScopeId = normalize(financialProjection.scopeId);
114
+ const financialCoordinateIds = new Set(financialProjection.coordinates.map(coordinate => coordinate.coordinateId));
115
+ const savingsByCoordinateId = new Map(savingsAuthority.coordinates.map(coordinate => [coordinate.coordinateId, coordinate]));
116
+ if (financialCoordinateIds.size !== financialProjection.coordinates.length ||
117
+ savingsAuthority.coordinates.length !== financialProjection.coordinates.length ||
118
+ savingsAuthority.coordinates.some(coordinate => !financialCoordinateIds.has(coordinate.coordinateId))) {
119
+ throw new TypeError('Financial savings coordinates do not match the resource Financial Authority projection.');
120
+ }
121
+ const coordinates = financialProjection.coordinates.map(financialCoordinate => {
122
+ const coordinate = savingsByCoordinateId.get(financialCoordinate.coordinateId);
123
+ if (!coordinate)
124
+ throw new TypeError('Financial savings coordinate is missing.');
125
+ if (coordinate.status === 'unavailable')
126
+ return { ...coordinate, chargeInclusionPolicyRef };
127
+ const displayOwnerScopeIds = new Set((financialCoordinate.displayMemberBaselines ?? []).map(baseline => normalize(baseline.scopeId)));
128
+ displayOwnerScopeIds.delete(normalizedScopeId);
129
+ const selectedOwnerScopeIds = new Set([normalizedScopeId, ...displayOwnerScopeIds]);
130
+ const resourceAllocations = coordinate.allocations.filter(allocation => selectedOwnerScopeIds.has(normalize(allocation.ownerScopeId)));
131
+ const sourceResourceContributions = coordinate.resourceContributions.filter(contribution => selectedOwnerScopeIds.has(normalize(contribution.ownerScopeId)));
132
+ const sourceResourceContributionByOwner = new Map();
133
+ for (const contribution of sourceResourceContributions) {
134
+ const ownerScopeId = normalize(contribution.ownerScopeId);
135
+ if (sourceResourceContributionByOwner.has(ownerScopeId)) {
136
+ throw new TypeError('Financial savings resource contribution is ambiguous.');
137
+ }
138
+ sourceResourceContributionByOwner.set(ownerScopeId, contribution);
139
+ }
140
+ for (const ownerScopeId of selectedOwnerScopeIds) {
141
+ const sourceRecommendationSavings = coordinate.recommendationContributions
142
+ .filter(contribution => normalize(contribution.ownerScopeId) === ownerScopeId)
143
+ .reduce((total, contribution) => {
144
+ const next = total + contribution.savingsMinorUnits;
145
+ if (!Number.isSafeInteger(next)) {
146
+ throw new TypeError('Financial savings recommendation contribution overflows safe minor units.');
147
+ }
148
+ return next;
149
+ }, 0);
150
+ if ((sourceResourceContributionByOwner.get(ownerScopeId)?.savingsMinorUnits ?? 0) !== sourceRecommendationSavings) {
151
+ throw new TypeError('Financial savings recommendation contributions do not reconcile to the resource contribution.');
152
+ }
153
+ }
154
+ const policyUnavailableScenarioIds = new Set();
155
+ const chargeCompositionByBaselineId = new Map([
156
+ ...(financialCoordinate.chargeComposition ? [financialCoordinate.chargeComposition] : []),
157
+ ...(financialCoordinate.displayMemberChargeCompositions ?? []),
158
+ ].map(composition => [composition.baselineId, composition]));
159
+ const selectedAllocations = resourceAllocations.filter(allocation => {
160
+ if (chargeInclusionPolicyRef.policyId === AZURE_BILLED_ALL_CHARGES_POLICY_V1.policyRef.policyId &&
161
+ chargeInclusionPolicyRef.policyDigest === AZURE_BILLED_ALL_CHARGES_POLICY_V1.policyRef.policyDigest)
162
+ return true;
163
+ const disposition = classifyFinancialSavingsAllocationForPolicyV1(chargeCompositionByBaselineId, allocation, chargeInclusionPolicyRef);
164
+ if (disposition === 'unavailable')
165
+ policyUnavailableScenarioIds.add(allocation.scenarioId);
166
+ return disposition === 'included';
167
+ });
168
+ const allocationsByRecommendation = new Map();
169
+ for (const allocation of selectedAllocations) {
170
+ const key = `${normalize(allocation.ownerScopeId)}\u0000${allocation.recommendationId}`;
171
+ const current = allocationsByRecommendation.get(key) ?? [];
172
+ current.push(allocation);
173
+ allocationsByRecommendation.set(key, current);
174
+ }
175
+ const allRecommendationContributions = [...allocationsByRecommendation.entries()]
176
+ .sort(([left], [right]) => left.localeCompare(right))
177
+ .map(([, allocations]) => {
178
+ const firstAllocation = allocations[0];
179
+ if (!firstAllocation)
180
+ throw new TypeError('Financial savings recommendation contribution has no allocation.');
181
+ const savingsMinorUnits = allocations.reduce((total, allocation) => {
182
+ const next = total + allocation.savingsMinorUnits;
183
+ if (!Number.isSafeInteger(next)) {
184
+ throw new TypeError('Financial savings recommendation contribution overflows safe minor units.');
185
+ }
186
+ return next;
187
+ }, 0);
188
+ return {
189
+ ownerScopeId: normalize(firstAllocation.ownerScopeId),
190
+ recommendationId: firstAllocation.recommendationId,
191
+ allocationIds: allocations.map(allocation => allocation.allocationId),
192
+ savingsMinorUnits,
193
+ };
194
+ });
195
+ const recommendationContributions = allRecommendationContributions.filter(contribution => normalize(contribution.ownerScopeId) === normalizedScopeId);
196
+ const displayMemberRecommendationContributions = allRecommendationContributions.filter(contribution => displayOwnerScopeIds.has(normalize(contribution.ownerScopeId)));
197
+ const buildResourceContribution = (ownerScopeId) => {
198
+ const allocations = selectedAllocations.filter(allocation => normalize(allocation.ownerScopeId) === ownerScopeId);
199
+ if (allocations.length === 0)
200
+ return undefined;
201
+ const savingsMinorUnits = allocations.reduce((total, allocation) => {
202
+ const next = total + allocation.savingsMinorUnits;
203
+ if (!Number.isSafeInteger(next))
204
+ throw new TypeError('Financial savings resource contribution overflows safe minor units.');
205
+ return next;
206
+ }, 0);
207
+ return {
208
+ ownerScopeId,
209
+ allocationIds: allocations.map(allocation => allocation.allocationId),
210
+ savingsMinorUnits,
211
+ };
212
+ };
213
+ const resourceContribution = buildResourceContribution(normalizedScopeId);
214
+ const displayMemberResourceContributions = [...displayOwnerScopeIds]
215
+ .sort()
216
+ .map(buildResourceContribution)
217
+ .filter((contribution) => contribution !== undefined);
218
+ const unavailableActivationIds = new Set(coordinate.status === 'partial'
219
+ ? coordinate.activations.filter(activation => activation.result === 'unavailable').map(activation => activation.scenarioId)
220
+ : []);
221
+ const authorityCoordinate = financialAuthority?.coordinates.find(candidate => candidate.coordinateId === financialCoordinate.coordinateId);
222
+ if (financialAuthority !== undefined && !authorityCoordinate) {
223
+ throw new TypeError('Full Financial Authority coordinate is missing for the resource projection.');
224
+ }
225
+ const unavailableScenarioIds = [...new Set([...unavailableActivationIds, ...policyUnavailableScenarioIds])]
226
+ .filter(scenarioId => {
227
+ if (!authorityCoordinate) {
228
+ // Without the full authority there is no proof that an absent target
229
+ // projection belongs elsewhere. Preserve the gap on this resource.
230
+ return true;
231
+ }
232
+ const scenarioProjections = authorityCoordinate.projections.filter(projection => projection.scenarioId === scenarioId);
233
+ return scenarioProjections.length === 0 || scenarioProjections.some(projection => selectedOwnerScopeIds.has(normalize(projection.scopeId)));
234
+ })
235
+ .sort();
236
+ const composed = {
237
+ coordinateId: coordinate.coordinateId,
238
+ chargeInclusionPolicyRef,
239
+ currentAggregateBaselineId: coordinate.currentAggregateBaselineId,
240
+ accountingCurrencyCode: coordinate.accountingCurrencyCode,
241
+ minorUnitScale: coordinate.minorUnitScale,
242
+ roundingMode: coordinate.roundingMode,
243
+ ...(resourceContribution === undefined ? {} : { resourceContribution }),
244
+ recommendationContributions,
245
+ ...(displayMemberResourceContributions.length === 0 ? {} : { displayMemberResourceContributions }),
246
+ ...(displayMemberRecommendationContributions.length === 0 ? {} : { displayMemberRecommendationContributions }),
247
+ };
248
+ return unavailableScenarioIds.length > 0
249
+ ? { ...composed, status: 'partial', unavailableScenarioIds: unavailableScenarioIds }
250
+ : { ...composed, status: 'available' };
251
+ });
252
+ const firstCoordinate = coordinates[0];
253
+ if (!firstCoordinate)
254
+ throw new TypeError('Financial savings resource projection has no coordinates.');
255
+ return {
256
+ contractVersion: FINANCIAL_SAVINGS_RESOURCE_PROJECTION_CONTRACT_VERSION_V1,
257
+ savingsAuthorityId: savingsAuthority.savingsAuthorityId,
258
+ financialAuthorityId: savingsAuthority.financialAuthorityId,
259
+ artifactGeneration: savingsAuthority.artifactGeneration,
260
+ scopeId: normalizedScopeId,
261
+ coordinates: [firstCoordinate, ...coordinates.slice(1)],
262
+ };
263
+ };
@@ -5,6 +5,8 @@ import { isFinancialEvidenceAssessmentV1 } from './financialEvidenceAssessmentVa
5
5
  import { formatExactDecimalValue, multiplyExactDecimalValues, parseCanonicalDecimal, sumCanonicalDecimals } from '../common/exactDecimal.js';
6
6
  import { isFinancialBaselinePeriodV2, isFinancialEvidenceBundleV1, isFinancialScopeBaselineEnvelopeV2 } from './financialScopeBaselineValidation.js';
7
7
  import { isFinancialAuthorityComponentDescriptorV1, isFinancialDisplayRollupV1 } from './financialDisplayRollupValidation.js';
8
+ import { AZURE_BILLED_ALL_CHARGES_POLICY_V1 } from './financialChargeComposition.js';
9
+ import { isFinancialChargeCompositionV1 } from './financialChargeCompositionValidation.js';
8
10
  const SHA256_ID = /^sha256:[0-9a-f]{64}$/;
9
11
  const CURRENCY = /^[A-Z]{3}$/;
10
12
  const AZURE_RESOURCE_TYPE = /^[a-z0-9.-]+\/[a-z0-9._/-]+$/;
@@ -55,6 +57,7 @@ const canonicalCoordinatePreimage = (value) => ({
55
57
  ownerBaselines: [...value.ownerBaselines].sort((left, right) => left.scopeId.localeCompare(right.scopeId)),
56
58
  residualBaseline: value.residualBaseline,
57
59
  aggregateBaseline: value.aggregateBaseline,
60
+ chargeCompositions: [...value.chargeCompositions].sort((left, right) => left.baselineId.localeCompare(right.baselineId)),
58
61
  componentDescriptors: [...value.componentDescriptors].sort((left, right) => `${left.baselineId}\u0000${left.componentId}`.localeCompare(`${right.baselineId}\u0000${right.componentId}`)),
59
62
  displayRollups: [...value.displayRollups].sort((left, right) => left.displayRollupId.localeCompare(right.displayRollupId)),
60
63
  projections: [...value.projections].sort((left, right) => left.scenarioId.localeCompare(right.scenarioId)),
@@ -95,6 +98,7 @@ const isCoordinate = (value, coveredScopeIds, financialRoleByScope, providerAcco
95
98
  'ownerBaselines',
96
99
  'residualBaseline',
97
100
  'aggregateBaseline',
101
+ 'chargeCompositions',
98
102
  'componentDescriptors',
99
103
  'displayRollups',
100
104
  'projections',
@@ -113,6 +117,9 @@ const isCoordinate = (value, coveredScopeIds, financialRoleByScope, providerAcco
113
117
  !value.ownerBaselines.every(isFinancialScopeBaselineEnvelopeV2) ||
114
118
  !isFinancialScopeBaselineEnvelopeV2(value.residualBaseline) ||
115
119
  !isFinancialScopeBaselineEnvelopeV2(value.aggregateBaseline) ||
120
+ !Array.isArray(value.chargeCompositions) ||
121
+ value.chargeCompositions.length > 20001 ||
122
+ !value.chargeCompositions.every(isFinancialChargeCompositionV1) ||
116
123
  !Array.isArray(value.componentDescriptors) ||
117
124
  value.componentDescriptors.length > 20000 ||
118
125
  !value.componentDescriptors.every(isFinancialAuthorityComponentDescriptorV1) ||
@@ -173,6 +180,38 @@ const isCoordinate = (value, coveredScopeIds, financialRoleByScope, providerAcco
173
180
  }
174
181
  if (coordinate.residualBaseline.status === 'available' && !bundleIds.has(coordinate.residualBaseline.evidenceBundleId))
175
182
  return false;
183
+ const composableBaselines = [...coordinate.ownerBaselines, coordinate.residualBaseline].filter((baseline) => baseline.status === 'available' && baseline.baselineKind === 'owner');
184
+ const chargeCompositionByBaselineId = new Map(coordinate.chargeCompositions.map(composition => [composition.baselineId, composition]));
185
+ if (chargeCompositionByBaselineId.size !== coordinate.chargeCompositions.length ||
186
+ coordinate.chargeCompositions.length !== composableBaselines.length)
187
+ return false;
188
+ for (const baseline of composableBaselines) {
189
+ const composition = chargeCompositionByBaselineId.get(baseline.baselineId);
190
+ if (composition === undefined ||
191
+ canonicalText(baseline.chargeInclusionPolicyRef) !== canonicalText(AZURE_BILLED_ALL_CHARGES_POLICY_V1.policyRef) ||
192
+ composition.ownerScopeId !== baseline.scopeId ||
193
+ periodText(composition.period) !== periodText(baseline.period) ||
194
+ composition.costBasis !== baseline.costBasis ||
195
+ composition.estimateLens !== baseline.estimateLens ||
196
+ composition.accountingCurrencyCode !== baseline.total.currencyCode ||
197
+ composition.reconciliation.sourceTotal !== baseline.total.amount)
198
+ return false;
199
+ const baselineComponentById = new Map(baseline.components.map(component => [component.componentId, component]));
200
+ const partitionedComponentIds = composition.buckets.flatMap(bucket => bucket.componentIds);
201
+ if (partitionedComponentIds.length !== baseline.components.length ||
202
+ new Set(partitionedComponentIds).size !== partitionedComponentIds.length ||
203
+ partitionedComponentIds.some(componentId => !baselineComponentById.has(componentId)))
204
+ return false;
205
+ for (const bucket of composition.buckets) {
206
+ try {
207
+ if (formatExactDecimalValue(sumCanonicalDecimals(bucket.componentIds.map(componentId => baselineComponentById.get(componentId).amount))) !== bucket.amount)
208
+ return false;
209
+ }
210
+ catch {
211
+ return false;
212
+ }
213
+ }
214
+ }
176
215
  const financialOwnerBaselines = coordinate.ownerBaselines.filter(baseline => financialRoleByScope.get(baseline.scopeId) === 'owner');
177
216
  const availableMembers = [...financialOwnerBaselines, coordinate.residualBaseline]
178
217
  .filter(baseline => baseline.status === 'available')
@@ -256,7 +295,7 @@ const isCoordinate = (value, coveredScopeIds, financialRoleByScope, providerAcco
256
295
  (projection.targetEvidenceBundleId !== undefined && !bundleIds.has(projection.targetEvidenceBundleId)) ||
257
296
  (targetAssessment !== undefined &&
258
297
  (targetAssessment.request.scopeId !== projection.scopeId ||
259
- targetAssessment.result !== 'available' ||
298
+ (projection.status === 'available' && targetAssessment.result !== 'available') ||
260
299
  targetAssessment.evidenceBundleId !== projection.targetEvidenceBundleId)) ||
261
300
  (projection.baselineId !== undefined && (owner.status !== 'available' || projection.baselineId !== owner.baselineId)) ||
262
301
  (projection.status === 'available' && owner.status !== 'available'))
@@ -328,6 +367,15 @@ const isCoordinate = (value, coveredScopeIds, financialRoleByScope, providerAcco
328
367
  return false;
329
368
  continue;
330
369
  }
370
+ if (projection.operationKind === 'replace-quantity-and-rate') {
371
+ if (!('targetQuantity' in applied) || !('targetRate' in applied))
372
+ return false;
373
+ if (applied.targetQuantity.unit !== applied.targetRate.quantityUnit ||
374
+ applied.targetRate.currencyCode !== projection.accountingCurrencyCode ||
375
+ formatExactDecimalValue(multiplyExactDecimalValues(parseCanonicalDecimal(applied.targetQuantity.amount), parseCanonicalDecimal(applied.targetRate.amount))) !== applied.targetAmount)
376
+ return false;
377
+ continue;
378
+ }
331
379
  if (!('sourceRate' in applied) || !('targetQuantity' in applied) || component.effectiveRate === undefined)
332
380
  return false;
333
381
  if (applied.sourceRate.amount !== component.effectiveRate.amount ||
@@ -495,3 +543,225 @@ export const isFinancialAuthorityViewV1 = (value) => {
495
543
  export const isFinancialAuthorityViewBoundToArtifactGenerationV1 = (value, expected) => isFinancialAuthorityViewV1(value) &&
496
544
  value.artifactGeneration.runId === expected.runId &&
497
545
  value.artifactGeneration.generatedAt === expected.generatedAt;
546
+ const isSameProviderAccountSet = (left, right) => {
547
+ if (left.length !== right.length)
548
+ return false;
549
+ const sortedLeft = [...left].sort();
550
+ const sortedRight = [...right].sort();
551
+ return sortedLeft.every((value, index) => value === sortedRight[index]);
552
+ };
553
+ const isResourceProjectionCoordinate = (value, projection, assessmentById, bundleIds) => {
554
+ if (!isRecord(value) ||
555
+ !hasExactFields(value, [
556
+ 'coordinateId',
557
+ 'periodRole',
558
+ 'period',
559
+ 'costBasis',
560
+ 'estimateLens',
561
+ 'ownerBaseline',
562
+ 'componentDescriptors',
563
+ 'displayRollups',
564
+ 'projections',
565
+ ], [
566
+ 'requestedCurrencyCode',
567
+ 'displayMemberBaselines',
568
+ 'chargeComposition',
569
+ 'displayMemberChargeCompositions',
570
+ ]) ||
571
+ !isHash(value.coordinateId) ||
572
+ (value.periodRole !== 'current' && value.periodRole !== 'previous') ||
573
+ !isFinancialBaselinePeriodV2(value.period) ||
574
+ typeof value.costBasis !== 'string' ||
575
+ !COST_BASES.has(value.costBasis) ||
576
+ typeof value.estimateLens !== 'string' ||
577
+ !ESTIMATE_LENSES.has(value.estimateLens) ||
578
+ (value.requestedCurrencyCode !== undefined && (typeof value.requestedCurrencyCode !== 'string' || !CURRENCY.test(value.requestedCurrencyCode))) ||
579
+ !isFinancialScopeBaselineEnvelopeV2(value.ownerBaseline) ||
580
+ (value.displayMemberBaselines !== undefined &&
581
+ (!Array.isArray(value.displayMemberBaselines) ||
582
+ value.displayMemberBaselines.length > 20000 ||
583
+ !value.displayMemberBaselines.every(isFinancialScopeBaselineEnvelopeV2))) ||
584
+ (value.chargeComposition !== undefined && !isFinancialChargeCompositionV1(value.chargeComposition)) ||
585
+ (value.displayMemberChargeCompositions !== undefined &&
586
+ (!Array.isArray(value.displayMemberChargeCompositions) ||
587
+ value.displayMemberChargeCompositions.length > 20000 ||
588
+ !value.displayMemberChargeCompositions.every(isFinancialChargeCompositionV1))) ||
589
+ !Array.isArray(value.componentDescriptors) ||
590
+ value.componentDescriptors.length > 20000 ||
591
+ !value.componentDescriptors.every(isFinancialAuthorityComponentDescriptorV1) ||
592
+ !Array.isArray(value.displayRollups) ||
593
+ value.displayRollups.length > 20000 ||
594
+ !value.displayRollups.every(isFinancialDisplayRollupV1) ||
595
+ !Array.isArray(value.projections) ||
596
+ value.projections.length > 20000 ||
597
+ !value.projections.every(isFinancialProjectionEnvelopeV1))
598
+ return false;
599
+ const coordinate = value;
600
+ const baseline = coordinate.ownerBaseline;
601
+ const displayMemberBaselines = coordinate.displayMemberBaselines ?? [];
602
+ const displayMemberChargeCompositions = coordinate.displayMemberChargeCompositions ?? [];
603
+ const assessment = assessmentById.get(baseline.assessmentId);
604
+ if (normalizeScopeId(baseline.scopeId) !== projection.scopeId ||
605
+ baseline.costBasis !== coordinate.costBasis ||
606
+ baseline.estimateLens !== coordinate.estimateLens ||
607
+ periodText(baseline.period) !== periodText(coordinate.period) ||
608
+ baseline.requestedCurrencyCode !== coordinate.requestedCurrencyCode ||
609
+ !isSameProviderAccountSet(baseline.providerAccountRefs, projection.providerAccountRefs) ||
610
+ !assessment ||
611
+ assessment.request.scopeId !== baseline.scopeId ||
612
+ assessment.request.scopeKind !== baseline.scopeKind ||
613
+ assessment.result !== baseline.status)
614
+ return false;
615
+ if (projection.financialRole === 'display-only' && (baseline.status !== 'unavailable' || baseline.unavailableReason !== 'unsupported-scope')) {
616
+ return false;
617
+ }
618
+ if (projection.financialRole === 'unclassified' && (baseline.status !== 'unavailable' || baseline.unavailableReason !== 'ownership-unresolved')) {
619
+ return false;
620
+ }
621
+ if (baseline.status !== 'available' || baseline.baselineKind !== 'owner') {
622
+ return (displayMemberBaselines.length === 0 &&
623
+ coordinate.chargeComposition === undefined &&
624
+ displayMemberChargeCompositions.length === 0 &&
625
+ coordinate.componentDescriptors.length === 0 &&
626
+ coordinate.displayRollups.length === 0 &&
627
+ coordinate.projections.every(projectionValue => normalizeScopeId(projectionValue.scopeId) === projection.scopeId) &&
628
+ new Set(coordinate.projections.map(projectionValue => projectionValue.scenarioId)).size === coordinate.projections.length);
629
+ }
630
+ if (baseline.scopeKind !== 'canonical-resource-owner' && baseline.scopeKind !== 'composite-resource')
631
+ return false;
632
+ if (!bundleIds.has(baseline.evidenceBundleId) || assessment.evidenceBundleId !== baseline.evidenceBundleId)
633
+ return false;
634
+ const availableDisplayMemberBaselines = displayMemberBaselines.filter((candidate) => candidate.status === 'available' && candidate.baselineKind === 'owner');
635
+ if (availableDisplayMemberBaselines.length !== displayMemberBaselines.length)
636
+ return false;
637
+ const projectedBaselines = [baseline, ...availableDisplayMemberBaselines];
638
+ if (new Set(projectedBaselines.map(candidate => candidate.baselineId)).size !== projectedBaselines.length ||
639
+ displayMemberBaselines.some(candidate => {
640
+ if (candidate.status !== 'available' ||
641
+ candidate.baselineKind !== 'owner' ||
642
+ (candidate.scopeKind !== 'canonical-resource-owner' && candidate.scopeKind !== 'composite-resource') ||
643
+ candidate.costBasis !== coordinate.costBasis ||
644
+ candidate.estimateLens !== coordinate.estimateLens ||
645
+ periodText(candidate.period) !== periodText(coordinate.period) ||
646
+ candidate.requestedCurrencyCode !== coordinate.requestedCurrencyCode ||
647
+ candidate.total.currencyCode !== baseline.total.currencyCode ||
648
+ !isSameProviderAccountSet(candidate.providerAccountRefs, projection.providerAccountRefs) ||
649
+ !bundleIds.has(candidate.evidenceBundleId))
650
+ return true;
651
+ const candidateAssessment = assessmentById.get(candidate.assessmentId);
652
+ return (!candidateAssessment ||
653
+ candidateAssessment.request.scopeId !== candidate.scopeId ||
654
+ candidateAssessment.request.scopeKind !== candidate.scopeKind ||
655
+ candidateAssessment.result !== candidate.status ||
656
+ candidateAssessment.evidenceBundleId !== candidate.evidenceBundleId);
657
+ }))
658
+ return false;
659
+ const compositions = [coordinate.chargeComposition, ...displayMemberChargeCompositions];
660
+ if (compositions.some(candidate => candidate === undefined))
661
+ return false;
662
+ const compositionByBaselineId = new Map(compositions.map(candidate => [candidate.baselineId, candidate]));
663
+ if (compositions.length !== projectedBaselines.length || compositionByBaselineId.size !== projectedBaselines.length)
664
+ return false;
665
+ for (const projectedBaseline of projectedBaselines) {
666
+ const composition = compositionByBaselineId.get(projectedBaseline.baselineId);
667
+ if (!composition ||
668
+ composition.baselineId !== projectedBaseline.baselineId ||
669
+ normalizeScopeId(composition.ownerScopeId) !== normalizeScopeId(projectedBaseline.scopeId) ||
670
+ periodText(composition.period) !== periodText(projectedBaseline.period) ||
671
+ composition.costBasis !== projectedBaseline.costBasis ||
672
+ composition.estimateLens !== projectedBaseline.estimateLens ||
673
+ composition.accountingCurrencyCode !== projectedBaseline.total.currencyCode ||
674
+ composition.reconciliation.sourceTotal !== projectedBaseline.total.amount)
675
+ return false;
676
+ }
677
+ const composition = coordinate.chargeComposition;
678
+ if (!composition ||
679
+ composition.baselineId !== baseline.baselineId ||
680
+ normalizeScopeId(composition.ownerScopeId) !== projection.scopeId ||
681
+ periodText(composition.period) !== periodText(baseline.period) ||
682
+ composition.costBasis !== baseline.costBasis ||
683
+ composition.estimateLens !== baseline.estimateLens ||
684
+ composition.accountingCurrencyCode !== baseline.total.currencyCode ||
685
+ composition.reconciliation.sourceTotal !== baseline.total.amount)
686
+ return false;
687
+ const componentKeys = new Set(projectedBaselines.flatMap(projectedBaseline => projectedBaseline.components.map(component => `${projectedBaseline.baselineId}\u0000${component.componentId}`)));
688
+ const ownerComponentKeys = new Set(baseline.components.map(component => `${baseline.baselineId}\u0000${component.componentId}`));
689
+ const descriptorKeys = coordinate.componentDescriptors.map(descriptor => `${descriptor.baselineId}\u0000${descriptor.componentId}`);
690
+ if (descriptorKeys.length !== componentKeys.size ||
691
+ new Set(descriptorKeys).size !== descriptorKeys.length ||
692
+ descriptorKeys.some(key => !componentKeys.has(key)) ||
693
+ coordinate.displayRollups.some(rollup => normalizeScopeId(rollup.displayScopeId) !== projection.scopeId ||
694
+ rollup.members.some(member => !componentKeys.has(`${member.baselineId}\u0000${member.componentId}`))) ||
695
+ coordinate.projections.some(projectionValue => normalizeScopeId(projectionValue.scopeId) !== projection.scopeId))
696
+ return false;
697
+ const rolledUpKeys = coordinate.displayRollups.flatMap(rollup => rollup.members.map(member => `${member.baselineId}\u0000${member.componentId}`));
698
+ return (ownerComponentKeys.size > 0 &&
699
+ new Set(rolledUpKeys).size === rolledUpKeys.length &&
700
+ rolledUpKeys.every(key => componentKeys.has(key)) &&
701
+ [...ownerComponentKeys].every(key => rolledUpKeys.includes(key)) &&
702
+ [...componentKeys].every(key => rolledUpKeys.includes(key)) &&
703
+ new Set(coordinate.projections.map(projectionValue => projectionValue.scenarioId)).size === coordinate.projections.length);
704
+ };
705
+ /** Strictly validates one bounded, non-additive resource projection without requiring the full authority ledger. */
706
+ export const isFinancialAuthorityResourceProjectionV1 = (value) => {
707
+ if (!isRecord(value) ||
708
+ !hasExactFields(value, [
709
+ 'contractVersion',
710
+ 'authorityId',
711
+ 'provider',
712
+ 'providerAccountRefs',
713
+ 'artifactGeneration',
714
+ 'billingGenerationId',
715
+ 'resourceType',
716
+ 'financialRole',
717
+ 'scopeId',
718
+ 'evidenceBundles',
719
+ 'evidenceAssessments',
720
+ 'coordinates',
721
+ ]) ||
722
+ value.contractVersion !== 'financial-authority-resource-projection/v1' ||
723
+ !isHash(value.authorityId) ||
724
+ value.provider !== 'azure' ||
725
+ !Array.isArray(value.providerAccountRefs) ||
726
+ value.providerAccountRefs.length === 0 ||
727
+ value.providerAccountRefs.length > 64 ||
728
+ !value.providerAccountRefs.every(isIdentity) ||
729
+ new Set(value.providerAccountRefs).size !== value.providerAccountRefs.length ||
730
+ !isRecord(value.artifactGeneration) ||
731
+ !hasExactFields(value.artifactGeneration, ['runId', 'generatedAt']) ||
732
+ !isIdentity(value.artifactGeneration.runId) ||
733
+ !isIsoInstant(value.artifactGeneration.generatedAt) ||
734
+ !isIdentity(value.billingGenerationId) ||
735
+ typeof value.resourceType !== 'string' ||
736
+ !AZURE_RESOURCE_TYPE.test(value.resourceType) ||
737
+ value.resourceType !== normalizeScopeId(value.resourceType) ||
738
+ (value.financialRole !== 'owner' && value.financialRole !== 'display-only' && value.financialRole !== 'unclassified') ||
739
+ !isIdentity(value.scopeId) ||
740
+ value.scopeId !== normalizeScopeId(value.scopeId) ||
741
+ !Array.isArray(value.evidenceBundles) ||
742
+ value.evidenceBundles.length > 20000 ||
743
+ !value.evidenceBundles.every(isFinancialEvidenceBundleV1) ||
744
+ !Array.isArray(value.evidenceAssessments) ||
745
+ value.evidenceAssessments.length > 20000 ||
746
+ !value.evidenceAssessments.every(isFinancialEvidenceAssessmentV1) ||
747
+ !Array.isArray(value.coordinates) ||
748
+ value.coordinates.length === 0 ||
749
+ value.coordinates.length > 128)
750
+ return false;
751
+ const projection = value;
752
+ const bundleIds = new Set(projection.evidenceBundles.map(bundle => bundle.bundleId));
753
+ const assessmentById = new Map(projection.evidenceAssessments.map(assessment => [assessment.assessmentId, assessment]));
754
+ const projectedScopeIds = new Set([
755
+ projection.scopeId,
756
+ ...projection.coordinates.flatMap(coordinate => (coordinate.displayMemberBaselines ?? []).map(baseline => normalizeScopeId(baseline.scopeId))),
757
+ ]);
758
+ if (bundleIds.size !== projection.evidenceBundles.length || assessmentById.size !== projection.evidenceAssessments.length)
759
+ return false;
760
+ if (projection.evidenceAssessments.some(assessment => (assessment.evidenceBundleId !== undefined && !bundleIds.has(assessment.evidenceBundleId)) ||
761
+ !isSameProviderAccountSet(assessment.request.providerAccountRefs, projection.providerAccountRefs) ||
762
+ !projectedScopeIds.has(normalizeScopeId(assessment.request.scopeId))) ||
763
+ !projection.coordinates.every(coordinate => isResourceProjectionCoordinate(coordinate, projection, assessmentById, bundleIds)) ||
764
+ new Set(projection.coordinates.map(coordinate => coordinate.coordinateId)).size !== projection.coordinates.length)
765
+ return false;
766
+ return true;
767
+ };
@@ -0,0 +1,36 @@
1
+ import { sha256Utf8 } from '../common/sha256.js';
2
+ export const FINANCIAL_CHARGE_COMPOSITION_SCHEMA_VERSION_V1 = 1;
3
+ export const FINANCIAL_CHARGE_COMPOSITION_CONTRACT_VERSION_V1 = 'financial-charge-composition/v1';
4
+ export const FINANCIAL_CHARGE_INCLUSION_POLICY_CONTRACT_VERSION_V1 = 'financial-charge-inclusion-policy/v1';
5
+ const createRegisteredPolicy = (definition) => {
6
+ const { policyId, ...policy } = definition;
7
+ const registered = {
8
+ ...policy,
9
+ includeSources: Object.freeze([...policy.includeSources]),
10
+ excludeSources: Object.freeze([...policy.excludeSources]),
11
+ withholdSources: Object.freeze([...policy.withholdSources]),
12
+ policyRef: Object.freeze({ policyId, policyDigest: `sha256:${sha256Utf8(JSON.stringify(definition))}` }),
13
+ };
14
+ return Object.freeze(registered);
15
+ };
16
+ export const AZURE_BILLED_ALL_CHARGES_POLICY_V1 = createRegisteredPolicy({
17
+ schemaVersion: 1,
18
+ contractVersion: FINANCIAL_CHARGE_INCLUSION_POLICY_CONTRACT_VERSION_V1,
19
+ policyId: 'azure-billed-all-charges/v1',
20
+ includeSources: ['azure-native', 'marketplace', 'unknown'],
21
+ excludeSources: [],
22
+ withholdSources: [],
23
+ });
24
+ export const AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_V1 = createRegisteredPolicy({
25
+ schemaVersion: 1,
26
+ contractVersion: FINANCIAL_CHARGE_INCLUSION_POLICY_CONTRACT_VERSION_V1,
27
+ policyId: 'azure-cloud-services-excluding-marketplace/v1',
28
+ includeSources: ['azure-native'],
29
+ excludeSources: ['marketplace'],
30
+ withholdSources: ['unknown'],
31
+ });
32
+ export const FINANCIAL_CHARGE_INCLUSION_POLICIES_V1 = Object.freeze([
33
+ AZURE_BILLED_ALL_CHARGES_POLICY_V1,
34
+ AZURE_CLOUD_SERVICES_EXCLUDING_MARKETPLACE_POLICY_V1,
35
+ ]);
36
+ export const resolveFinancialChargeInclusionPolicyV1 = (policyRef) => policyRef !== null && typeof policyRef === 'object' && FINANCIAL_CHARGE_INCLUSION_POLICIES_V1.find(policy => policy.policyRef.policyId === policyRef.policyId && policy.policyRef.policyDigest === policyRef.policyDigest) || undefined;