@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
@@ -1,8 +1,9 @@
1
1
  import { multiplyExactDecimalValues, parseCanonicalDecimal, subtractExactDecimalValues } from '../common/exactDecimal.js';
2
2
  import { sha256Utf8 } from '../common/sha256.js';
3
3
  import { isCanonicalExactMoney } from './financialValidationPrimitives.js';
4
+ import { isFinancialChargeInclusionPolicyRefV1 } from './financialChargeCompositionValidation.js';
4
5
  import { FINANCIAL_POLICY_DEFINITION_CONTRACT_VERSION_V1, FINANCIAL_POLICY_EVALUATION_CONTRACT_VERSION_V1, } from './financialPolicy.js';
5
- import { FINANCIAL_DATAFLOW_LIMITS_V1, canonicalizeFinancialDataflowJsonV1, canonicalizeFinancialDataflowCoordinateV1, hasFinancialDataflowExactFieldsV1, isFinancialDataflowCurrencyV1, createFinancialDataflowCoordinateIdV1, isFinancialDataflowHashV1, isFinancialDataflowIdentityV1, isFinancialDataflowIsoInstantV1, isFinancialDataflowRecordV1, isFinancialDataflowScopeV1, isFinancialDataflowSortedUniqueStringsV1, isFinancialDataflowValueWithinLimitsV1, } from './financialDataflowValidation.js';
6
+ import { FINANCIAL_DATAFLOW_LIMITS_V1, canonicalizeFinancialDataflowJsonV1, canonicalizeFinancialDataflowCoordinateV1, hasFinancialDataflowExactFieldsV1, isFinancialDataflowCurrencyV1, createFinancialDataflowCoordinateIdV1, isFinancialDataflowHashV1, isFinancialDataflowIdentityV1, isFinancialDataflowIsoInstantV1, isFinancialDataflowRecordV1, isFinancialDataflowScopeSelectorV1, isFinancialDataflowSortedUniqueStringsV1, isFinancialDataflowValueWithinLimitsV1, } from './financialDataflowValidation.js';
6
7
  import { isCurrentSpendCompositionV1 } from './financialDataflowValidation.js';
7
8
  import { isFinancialAnalyticsProjectionV1 } from './financialAnalyticsValidation.js';
8
9
  const COST_BASES = new Set(['billed', 'amortized']);
@@ -10,6 +11,12 @@ const ESTIMATE_LENSES = new Set(['billing-only', 'include-estimates', 'estimates
10
11
  const MATCHED_THRESHOLD_KINDS = new Set(['amount', 'percent', 'minimum-amount', 'minimum-delta', 'minimum-percent-change']);
11
12
  const MAX_THRESHOLDS = 64;
12
13
  const MAX_DESTINATIONS = 256;
14
+ const isCanonicalPolicyRevision = (value) => {
15
+ if (typeof value !== 'string' || !/^[1-9]\d*$/.test(value))
16
+ return false;
17
+ const parsed = Number(value);
18
+ return Number.isSafeInteger(parsed) && String(parsed) === value;
19
+ };
13
20
  const isCanonicalDecimal = (value) => typeof value === 'string' && isCanonicalExactMoney({ amount: value, currencyCode: 'AUD' });
14
21
  const isNonNegativeDecimal = (value) => {
15
22
  if (!isCanonicalDecimal(value))
@@ -46,28 +53,63 @@ const isThresholdSet = (value) => {
46
53
  }
47
54
  return new Set(value.amounts).size === value.amounts.length && new Set(value.percents).size === value.percents.length;
48
55
  };
56
+ const isScopeSelectorBoundToProviderAccounts = (selector, providerAccountRefs) => {
57
+ if (!isFinancialDataflowScopeSelectorV1(selector) || !Array.isArray(providerAccountRefs))
58
+ return false;
59
+ const providerSubscriptions = providerAccountRefs.map(value => {
60
+ if (typeof value !== 'string' || !value.toLowerCase().startsWith('azure-subscription:'))
61
+ return undefined;
62
+ const subscriptionId = value.slice('azure-subscription:'.length).trim().toLowerCase();
63
+ return subscriptionId || undefined;
64
+ });
65
+ if (providerSubscriptions.some(value => value === undefined))
66
+ return false;
67
+ const authorized = new Set(providerSubscriptions);
68
+ if (selector.kind === 'subscription' || selector.kind === 'multi-subscription') {
69
+ const selected = selector.subscriptionIds.map(value => value.trim().toLowerCase());
70
+ return selected.length === authorized.size && selected.every(value => authorized.has(value));
71
+ }
72
+ if (selector.kind === 'tag-scope')
73
+ return true;
74
+ const ids = selector.kind === 'resource' ? selector.resourceIds : selector.resourceGroupIds;
75
+ return ids.every(value => {
76
+ const match = /^\/subscriptions\/([^/]+)(?:\/|$)/i.exec(value.trim());
77
+ return match?.[1] !== undefined && authorized.has(match[1].toLowerCase());
78
+ });
79
+ };
49
80
  const isCoordinateRequest = (value, companyId) => isFinancialDataflowRecordV1(value) &&
50
81
  hasFinancialDataflowExactFieldsV1(value, [
51
82
  'provider',
52
83
  'providerAccountRefs',
53
84
  'scope',
85
+ 'scopeSelector',
54
86
  'period',
55
87
  'costBasis',
56
88
  'estimateLens',
89
+ 'chargeInclusionPolicyRef',
57
90
  'requiredAccountingCurrencyCode',
58
91
  ]) &&
59
92
  value.provider === 'azure' &&
60
93
  isFinancialDataflowSortedUniqueStringsV1(value.providerAccountRefs, FINANCIAL_DATAFLOW_LIMITS_V1.maximumProviderAccounts) &&
61
94
  value.providerAccountRefs.length > 0 &&
62
- isFinancialDataflowScopeV1(value.scope) &&
95
+ isFinancialDataflowRecordV1(value.scope) &&
96
+ hasFinancialDataflowExactFieldsV1(value.scope, ['kind', 'scopeId']) &&
97
+ ['resource', 'resource-group', 'subscription', 'tag-scope', 'multi-subscription'].includes(String(value.scope.kind)) &&
98
+ isFinancialDataflowIdentityV1(value.scope.scopeId) &&
99
+ isFinancialDataflowScopeSelectorV1(value.scopeSelector) &&
100
+ value.scopeSelector.kind === value.scope.kind &&
101
+ isScopeSelectorBoundToProviderAccounts(value.scopeSelector, value.providerAccountRefs) &&
63
102
  isFinancialDataflowRecordV1(value.period) &&
64
- hasFinancialDataflowExactFieldsV1(value.period, ['kind', 'timeZone']) &&
103
+ hasFinancialDataflowExactFieldsV1(value.period, ['kind', 'dateBasis'], ['timeZone']) &&
65
104
  (value.period.kind === 'calendar-month' || value.period.kind === 'rolling-30-days') &&
66
- isFinancialDataflowIdentityV1(value.period.timeZone) &&
105
+ (value.period.dateBasis === 'utc'
106
+ ? value.period.timeZone === undefined
107
+ : value.period.dateBasis === 'company-local' && isFinancialDataflowIdentityV1(value.period.timeZone)) &&
67
108
  typeof value.costBasis === 'string' &&
68
109
  COST_BASES.has(value.costBasis) &&
69
110
  typeof value.estimateLens === 'string' &&
70
111
  ESTIMATE_LENSES.has(value.estimateLens) &&
112
+ isFinancialChargeInclusionPolicyRefV1(value.chargeInclusionPolicyRef) &&
71
113
  isFinancialDataflowCurrencyV1(value.requiredAccountingCurrencyCode) &&
72
114
  isFinancialDataflowIdentityV1(companyId);
73
115
  const isCriteria = (value, currencyCode) => {
@@ -89,13 +131,14 @@ const isCriteria = (value, currencyCode) => {
89
131
  (value.minimumDelta === undefined || isNonNegativeDecimal(value.minimumDelta)) &&
90
132
  (value.minimumPercentChange === undefined || isNonNegativeDecimal(value.minimumPercentChange)));
91
133
  };
92
- const isDefinitionIdentity = (value) => {
134
+ export const isFinancialPolicyDefinitionRevisionIdentityPreimageV1 = (value) => {
93
135
  if (!isFinancialDataflowRecordV1(value) ||
94
136
  !hasFinancialDataflowExactFieldsV1(value, [
95
137
  'schemaVersion',
96
138
  'contractVersion',
97
139
  'companyId',
98
140
  'definitionId',
141
+ 'displayName',
99
142
  'revision',
100
143
  'effectiveState',
101
144
  'coordinateRequest',
@@ -110,7 +153,8 @@ const isDefinitionIdentity = (value) => {
110
153
  value.contractVersion !== FINANCIAL_POLICY_DEFINITION_CONTRACT_VERSION_V1 ||
111
154
  !isFinancialDataflowIdentityV1(value.companyId) ||
112
155
  !isFinancialDataflowIdentityV1(value.definitionId) ||
113
- !isFinancialDataflowIdentityV1(value.revision) ||
156
+ !isFinancialDataflowIdentityV1(value.displayName) ||
157
+ !isCanonicalPolicyRevision(value.revision) ||
114
158
  !['enabled', 'disabled', 'deleted'].includes(String(value.effectiveState)) ||
115
159
  !isCoordinateRequest(value.coordinateRequest, value.companyId) ||
116
160
  !isFinancialDataflowRecordV1(value.coordinateRequest) ||
@@ -126,10 +170,22 @@ const isDefinitionIdentity = (value) => {
126
170
  !isFinancialDataflowIdentityV1(value.authoredByUserId)) {
127
171
  return false;
128
172
  }
129
- return value.effectiveState !== 'enabled' || value.destinationRefIds.length > 0;
173
+ if (value.criteria.kind === 'budget' &&
174
+ value.criteria.forecastThresholds !== undefined &&
175
+ (value.coordinateRequest.period.kind !== 'calendar-month' || value.coordinateRequest.estimateLens !== 'billing-only')) {
176
+ return false;
177
+ }
178
+ if (value.criteria.kind === 'cost-anomaly' &&
179
+ (value.coordinateRequest.period.kind !== 'rolling-30-days' || value.coordinateRequest.estimateLens !== 'billing-only')) {
180
+ return false;
181
+ }
182
+ // Alert Instance state is the canonical internal policy side effect.
183
+ // External destinations are optional and must not determine whether an
184
+ // enabled policy is valid or evaluable.
185
+ return true;
130
186
  };
131
187
  export const canonicalizeFinancialPolicyDefinitionRevisionIdentityV1 = (value) => {
132
- if (!isFinancialDataflowValueWithinLimitsV1(value) || !isDefinitionIdentity(value)) {
188
+ if (!isFinancialDataflowValueWithinLimitsV1(value) || !isFinancialPolicyDefinitionRevisionIdentityPreimageV1(value)) {
133
189
  throw new TypeError('Invalid FinancialPolicyDefinitionRevisionIdentityPreimageV1.');
134
190
  }
135
191
  const criteria = value.criteria.kind === 'budget'
@@ -171,7 +227,7 @@ export const isFinancialPolicyDefinitionRevisionV1 = (value) => {
171
227
  return false;
172
228
  const { policyDefinitionRevisionId, ...identity } = value;
173
229
  return (isFinancialDataflowHashV1(policyDefinitionRevisionId) &&
174
- isDefinitionIdentity(identity) &&
230
+ isFinancialPolicyDefinitionRevisionIdentityPreimageV1(identity) &&
175
231
  policyDefinitionRevisionId === createFinancialPolicyDefinitionRevisionIdV1(identity));
176
232
  };
177
233
  const isMatchedThresholds = (value) => Array.isArray(value) &&
@@ -216,8 +272,12 @@ const isEvaluationIdentity = (value) => {
216
272
  !isMatchedThresholds(value.matchedThresholds)) {
217
273
  return false;
218
274
  }
219
- const analyticsRequired = value.signalKind === 'budget-forecast' || value.signalKind === 'cost-anomaly';
220
- return analyticsRequired ? isFinancialDataflowHashV1(value.analyticsProjectionId) : value.analyticsProjectionId === undefined;
275
+ const analyticsSignal = value.signalKind === 'budget-forecast' || value.signalKind === 'cost-anomaly';
276
+ if (!analyticsSignal)
277
+ return value.analyticsProjectionId === undefined;
278
+ if (value.result !== 'unavailable')
279
+ return isFinancialDataflowHashV1(value.analyticsProjectionId);
280
+ return value.analyticsProjectionId === undefined || isFinancialDataflowHashV1(value.analyticsProjectionId);
221
281
  };
222
282
  export const canonicalizeFinancialPolicyEvaluationIdentityV1 = (value) => {
223
283
  if (!isFinancialDataflowValueWithinLimitsV1(value) || !isEvaluationIdentity(value)) {
@@ -332,6 +392,10 @@ const safeAnomalyMatchedThresholds = (definition, analyticsProjection) => {
332
392
  return undefined;
333
393
  }
334
394
  };
395
+ const isExpectedCalendarMonthTargetPartial = (composition) => composition.coordinate.period.windowKind === 'calendar-month' &&
396
+ composition.amount.status === 'partial' &&
397
+ composition.amount.reasonCodes.length === 1 &&
398
+ composition.amount.reasonCodes[0] === 'coverage-incomplete';
335
399
  /** Validates definition, coordinate, financial input, and signal links after authorization. */
336
400
  export const isFinancialPolicyEvaluationCompatibleV1 = (evaluation, definition, currentSpendComposition, analyticsProjection) => {
337
401
  if (!isFinancialPolicyEvaluationV1(evaluation) ||
@@ -355,13 +419,17 @@ export const isFinancialPolicyEvaluationCompatibleV1 = (evaluation, definition,
355
419
  !sameStrings(request.providerAccountRefs, coordinate.providerAccountRefs) ||
356
420
  request.scope.kind !== coordinate.scope.kind ||
357
421
  request.scope.scopeId !== coordinate.scope.scopeId ||
358
- request.scope.scopeFingerprint !== coordinate.scope.scopeFingerprint ||
359
422
  request.costBasis !== coordinate.costBasis ||
360
423
  request.estimateLens !== coordinate.estimateLens ||
361
- request.requiredAccountingCurrencyCode !== currency ||
424
+ canonicalizeFinancialDataflowJsonV1(request.chargeInclusionPolicyRef) !==
425
+ canonicalizeFinancialDataflowJsonV1(coordinate.chargeInclusionPolicyRef) ||
362
426
  coordinate.requestedCurrencyCode !== request.requiredAccountingCurrencyCode ||
427
+ (currency === undefined
428
+ ? currentSpendComposition.amount.status !== 'unavailable'
429
+ : request.requiredAccountingCurrencyCode !== currency) ||
363
430
  request.period.kind !== coordinate.period.windowKind ||
364
- request.period.timeZone !== periodTimeZone) {
431
+ request.period.dateBasis !== coordinate.period.requested.dateBasis ||
432
+ (request.period.dateBasis === 'company-local' && request.period.timeZone !== periodTimeZone)) {
365
433
  return false;
366
434
  }
367
435
  if (evaluation.result === 'matched' ? evaluation.matchedThresholds.length === 0 : evaluation.matchedThresholds.length > 0)
@@ -403,7 +471,16 @@ export const isFinancialPolicyEvaluationCompatibleV1 = (evaluation, definition,
403
471
  return evaluation.result === 'unavailable' && evaluation.matchedThresholds.length === 0;
404
472
  }
405
473
  if (currentSpendComposition.amount.status === 'partial') {
406
- return evaluation.result === 'partial' && evaluation.matchedThresholds.length === 0;
474
+ if (!isExpectedCalendarMonthTargetPartial(currentSpendComposition)) {
475
+ return evaluation.result === 'partial' && evaluation.matchedThresholds.length === 0;
476
+ }
477
+ if (definition.criteria.kind !== 'budget' || definition.criteria.currentSpendThresholds === undefined)
478
+ return false;
479
+ const expectedThresholds = safeBudgetMatchedThresholds(currentSpendComposition.amount.knownAmount, definition.criteria.budget.amount, definition.criteria.currentSpendThresholds);
480
+ if (expectedThresholds === undefined)
481
+ return false;
482
+ return (evaluation.result === (expectedThresholds.length > 0 ? 'matched' : 'not-matched') &&
483
+ hasExactMatchedThresholds(evaluation.matchedThresholds, expectedThresholds));
407
484
  }
408
485
  if (definition.criteria.kind !== 'budget' || definition.criteria.currentSpendThresholds === undefined)
409
486
  return false;
@@ -413,6 +490,12 @@ export const isFinancialPolicyEvaluationCompatibleV1 = (evaluation, definition,
413
490
  return (evaluation.result === (expectedThresholds.length > 0 ? 'matched' : 'not-matched') &&
414
491
  hasExactMatchedThresholds(evaluation.matchedThresholds, expectedThresholds));
415
492
  }
493
+ if (evaluation.result === 'unavailable' &&
494
+ evaluation.analyticsProjectionId === undefined &&
495
+ analyticsProjection === undefined &&
496
+ (evaluation.signalKind === 'budget-forecast' || evaluation.signalKind === 'cost-anomaly')) {
497
+ return evaluation.matchedThresholds.length === 0 && evaluation.reasonCode === 'analytics-projection-unavailable';
498
+ }
416
499
  if (!isFinancialAnalyticsProjectionV1(analyticsProjection) ||
417
500
  evaluation.analyticsProjectionId !== analyticsProjection.analyticsProjectionId ||
418
501
  analyticsProjection.coordinate.companyId !== coordinate.companyId ||
@@ -429,10 +512,21 @@ export const isFinancialPolicyEvaluationCompatibleV1 = (evaluation, definition,
429
512
  const actualAnalyticsKind = analyticsProjection.status === 'unavailable' ? analyticsProjection.resultKind : analyticsProjection.result.kind;
430
513
  if (actualAnalyticsKind !== expectedAnalyticsKind)
431
514
  return false;
515
+ if (analyticsProjection.currentSpendCompositionId !== undefined &&
516
+ analyticsProjection.currentSpendCompositionId !== currentSpendComposition.compositionId) {
517
+ return false;
518
+ }
519
+ if (evaluation.signalKind === 'budget-forecast' &&
520
+ analyticsProjection.status !== 'unavailable' &&
521
+ analyticsProjection.currentSpendCompositionId !== currentSpendComposition.compositionId) {
522
+ return false;
523
+ }
432
524
  if (currentSpendComposition.amount.status === 'unavailable' || analyticsProjection.status === 'unavailable') {
433
525
  return evaluation.result === 'unavailable' && evaluation.matchedThresholds.length === 0;
434
526
  }
435
- if (currentSpendComposition.amount.status === 'partial' || analyticsProjection.status === 'partial') {
527
+ if (analyticsProjection.status === 'partial' ||
528
+ (currentSpendComposition.amount.status === 'partial' &&
529
+ !(evaluation.signalKind === 'budget-forecast' && isExpectedCalendarMonthTargetPartial(currentSpendComposition)))) {
436
530
  return evaluation.result === 'partial' && evaluation.matchedThresholds.length === 0;
437
531
  }
438
532
  if (evaluation.result !== 'matched' && evaluation.result !== 'not-matched')
@@ -4,7 +4,15 @@ import { isCanonicalExactMoney } from './financialValidationPrimitives.js';
4
4
  import { FINANCIAL_PROJECTION_CONTRACT_VERSION_V1, FINANCIAL_PROJECTION_SCHEMA_VERSION_V1, FINANCIAL_PROJECTION_UNAVAILABLE_REASONS_V1, } from './financialProjection.js';
5
5
  const SHA256_ID = /^sha256:[0-9a-f]{64}$/;
6
6
  const CURRENCY = /^[A-Z]{3}$/;
7
- const OPERATIONS = new Set(['replace-rate', 'replace-quantity', 'remove-component', 'schedule-quantity', 'commitment-coverage']);
7
+ const OPERATIONS = new Set([
8
+ 'unclassified',
9
+ 'replace-rate',
10
+ 'replace-quantity',
11
+ 'replace-quantity-and-rate',
12
+ 'remove-component',
13
+ 'schedule-quantity',
14
+ 'commitment-coverage',
15
+ ]);
8
16
  const COST_BASES = new Set(['billed', 'amortized']);
9
17
  const ESTIMATE_LENSES = new Set(['actual-only', 'actual-plus-estimated', 'estimates-only']);
10
18
  const TARGET_PROVENANCE = new Set(['retail-derived', 'provider-quote-derived', 'billing-backed', 'estimated', 'configuration-derived']);
@@ -32,6 +40,16 @@ const isNonNegativeDecimal = (value, currency = 'AUD') => {
32
40
  }
33
41
  };
34
42
  const isUnit = (value) => isIdentity(value) && value.length <= 512;
43
+ const isReplayedProduct = (quantity, rate, targetAmount, currency) => {
44
+ if (!isNonNegativeDecimal(quantity) || !isNonNegativeDecimal(rate, currency) || !isDecimal(targetAmount, currency))
45
+ return false;
46
+ try {
47
+ return equalsDecimal(multiplyExactDecimalValues(parseCanonicalDecimal(quantity), parseCanonicalDecimal(rate)), parseCanonicalDecimal(targetAmount));
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ };
35
53
  const isCanonicalDate = (value) => typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value) && Number.isFinite(Date.parse(`${value}T00:00:00.000Z`));
36
54
  const isNormalizedAverageMonthProfile = (value) => isRecord(value) &&
37
55
  hasExactFields(value, ['kind', 'annualDayCount', 'monthDivisor', 'hoursPerDay', 'normalizedHours']) &&
@@ -203,7 +221,8 @@ const isAppliedComponentTargets = (value, operationKind, targetProvenance, targe
203
221
  !isNonNegativeDecimal(target.targetRate.amount) ||
204
222
  target.targetRate.currencyCode !== accountingCurrencyCode ||
205
223
  !isUnit(target.targetRate.quantityUnit) ||
206
- target.targetRate.quantityUnit !== target.sourceQuantity.unit)
224
+ target.targetRate.quantityUnit !== target.sourceQuantity.unit ||
225
+ !isReplayedProduct(target.sourceQuantity.amount, target.targetRate.amount, target.targetAmount, accountingCurrencyCode))
207
226
  return false;
208
227
  continue;
209
228
  }
@@ -218,7 +237,24 @@ const isAppliedComponentTargets = (value, operationKind, targetProvenance, targe
218
237
  !hasExactFields(target.targetQuantity, ['amount', 'unit']) ||
219
238
  !isNonNegativeDecimal(target.targetQuantity.amount) ||
220
239
  !isUnit(target.targetQuantity.unit) ||
221
- target.targetQuantity.unit !== target.sourceRate.unit)
240
+ target.targetQuantity.unit !== target.sourceRate.unit ||
241
+ !isReplayedProduct(target.targetQuantity.amount, target.sourceRate.amount, target.targetAmount, accountingCurrencyCode))
242
+ return false;
243
+ continue;
244
+ }
245
+ if (operationKind === 'replace-quantity-and-rate') {
246
+ if (!hasExactFields(target, ['componentId', 'targetAmount', 'targetConfigurationId', 'targetEvidenceRefIds', 'targetQuantity', 'targetRate']) ||
247
+ !isRecord(target.targetQuantity) ||
248
+ !hasExactFields(target.targetQuantity, ['amount', 'unit']) ||
249
+ !isNonNegativeDecimal(target.targetQuantity.amount) ||
250
+ !isUnit(target.targetQuantity.unit) ||
251
+ !isRecord(target.targetRate) ||
252
+ !hasExactFields(target.targetRate, ['amount', 'currencyCode', 'quantityUnit']) ||
253
+ !isNonNegativeDecimal(target.targetRate.amount, accountingCurrencyCode) ||
254
+ target.targetRate.currencyCode !== accountingCurrencyCode ||
255
+ !isUnit(target.targetRate.quantityUnit) ||
256
+ target.targetRate.quantityUnit !== target.targetQuantity.unit ||
257
+ !isReplayedProduct(target.targetQuantity.amount, target.targetRate.amount, target.targetAmount, accountingCurrencyCode))
222
258
  return false;
223
259
  continue;
224
260
  }
@@ -428,6 +464,10 @@ const isUnavailable = (value) => {
428
464
  !TARGET_PERIOD_CONVENTIONS.has(value.targetPeriodConvention) ||
429
465
  !isTargetPeriodProfileCompatible(value.targetPeriodConvention, value.targetPeriodProfile, false) ||
430
466
  (isObservedPeriodProfile(value.targetPeriodProfile) && value.operationKind !== 'commitment-coverage') ||
467
+ (value.operationKind === 'unclassified' &&
468
+ (value.unavailableReason !== 'target-evidence-unavailable' ||
469
+ !Array.isArray(value.affectedComponentIds) ||
470
+ value.affectedComponentIds.length !== 0)) ||
431
471
  (value.targetProvenance === 'configuration-derived' && value.operationKind !== 'remove-component') ||
432
472
  (value.operationKind === 'commitment-coverage' && value.targetProvenance !== 'provider-quote-derived') ||
433
473
  !isPossiblyEmptyHashArray(value.affectedComponentIds) ||
@@ -0,0 +1,2 @@
1
+ export const FINANCIAL_RESOURCE_SURFACE_PROJECTION_SCHEMA_VERSION_V1 = 1;
2
+ export const FINANCIAL_RESOURCE_SURFACE_PROJECTION_CONTRACT_VERSION_V1 = 'financial-resource-surface-projection/v1';
@@ -0,0 +1,243 @@
1
+ import { formatExactDecimalValue, parseCanonicalDecimal, subtractExactDecimalValues } from '../common/exactDecimal.js';
2
+ import { sha256Utf8 } from '../common/sha256.js';
3
+ import { FINANCIAL_RESOURCE_SURFACE_PROJECTION_CONTRACT_VERSION_V1, FINANCIAL_RESOURCE_SURFACE_PROJECTION_SCHEMA_VERSION_V1, } from './financialResourceSurfaceProjection.js';
4
+ import { isFinancialSurfaceCoordinateDefinitionV1, isFinancialSurfaceMoneyV1, } from './financialCurrentSpendSurfaceProjectionValidation.js';
5
+ import { canonicalizeFinancialSavingsJsonValue, hasExactFinancialSavingsFields, isFinancialSavingsHash, isFinancialSavingsIdentity, isFinancialSavingsIsoInstant, isFinancialSavingsRecord, } from './financialSavingsAuthorityValidationPrimitives.js';
6
+ import { isCanonicalExactMoney } from './financialValidationPrimitives.js';
7
+ const MAX_COORDINATES = 128;
8
+ const MAX_RESOURCES = 50000;
9
+ const MAX_VALUES_PER_RESOURCE = 128;
10
+ const MAX_SCENARIOS_PER_RESOURCE = 1024;
11
+ const MAX_REASONS = 64;
12
+ const RESOURCE_ROLES = new Set(['owner', 'display-only', 'unclassified']);
13
+ const SCENARIO_CATEGORIES = new Set(['cost', 'security', 'reliability', 'performance', 'operational-excellence', 'compliance']);
14
+ const CURRENCY = /^[A-Z]{3}$/;
15
+ const isCurrency = (value) => typeof value === 'string' && CURRENCY.test(value);
16
+ const isReasonCodes = (value) => Array.isArray(value) &&
17
+ value.length > 0 &&
18
+ value.length <= MAX_REASONS &&
19
+ value.every(isFinancialSavingsIdentity) &&
20
+ new Set(value).size === value.length;
21
+ const isExactAmount = (amount, currencyCode) => isCurrency(currencyCode) && isCanonicalExactMoney({ amount, currencyCode });
22
+ const isScenario = (value, coordinateIds, requestedCurrencyCode) => {
23
+ if (!isFinancialSavingsRecord(value))
24
+ return false;
25
+ const commonValid = isFinancialSavingsIdentity(value.scenarioId) &&
26
+ isFinancialSavingsHash(value.coordinateId) &&
27
+ coordinateIds.has(value.coordinateId) &&
28
+ (value.recommendationId === undefined || isFinancialSavingsIdentity(value.recommendationId)) &&
29
+ typeof value.category === 'string' &&
30
+ SCENARIO_CATEGORIES.has(value.category) &&
31
+ value.additivity === 'non-additive';
32
+ if (!commonValid)
33
+ return false;
34
+ const optionalCommon = ['recommendationId'];
35
+ if (value.status === 'available') {
36
+ if (!hasExactFinancialSavingsFields(value, [
37
+ 'scenarioId',
38
+ 'coordinateId',
39
+ 'category',
40
+ 'additivity',
41
+ 'status',
42
+ 'currentAmount',
43
+ 'targetAmount',
44
+ 'changeAmount',
45
+ 'currencyCode',
46
+ ], optionalCommon) ||
47
+ !isExactAmount(value.currentAmount, value.currencyCode) ||
48
+ !isExactAmount(value.targetAmount, value.currencyCode) ||
49
+ !isExactAmount(value.changeAmount, value.currencyCode) ||
50
+ (requestedCurrencyCode !== undefined && value.currencyCode !== requestedCurrencyCode))
51
+ return false;
52
+ return (value.changeAmount ===
53
+ formatExactDecimalValue(subtractExactDecimalValues(parseCanonicalDecimal(value.targetAmount), parseCanonicalDecimal(value.currentAmount))));
54
+ }
55
+ if (value.status === 'unavailable') {
56
+ return hasExactFinancialSavingsFields(value, ['scenarioId', 'coordinateId', 'category', 'additivity', 'status', 'reasonCodes'], optionalCommon) && isReasonCodes(value.reasonCodes);
57
+ }
58
+ if (value.status !== 'partial')
59
+ return false;
60
+ if (!hasExactFinancialSavingsFields(value, ['scenarioId', 'coordinateId', 'category', 'additivity', 'status', 'reasonCodes'], [...optionalCommon, 'currentAmount', 'targetAmount', 'changeAmount', 'currencyCode']) ||
61
+ !isReasonCodes(value.reasonCodes))
62
+ return false;
63
+ const monetaryFields = [value.currentAmount, value.targetAmount, value.changeAmount];
64
+ const presentAmounts = monetaryFields.filter(amount => amount !== undefined);
65
+ if (presentAmounts.length === 0)
66
+ return value.currencyCode === undefined;
67
+ return (isCurrency(value.currencyCode) &&
68
+ (requestedCurrencyCode === undefined || value.currencyCode === requestedCurrencyCode) &&
69
+ presentAmounts.every(amount => isExactAmount(amount, value.currencyCode)));
70
+ };
71
+ const canonicalizeValue = (value) => value.status === 'available' ? value : { ...value, reasonCodes: [...value.reasonCodes].sort() };
72
+ const canonicalizeScenario = (value) => value.status === 'available' ? value : { ...value, reasonCodes: [...value.reasonCodes].sort() };
73
+ export const canonicalizeFinancialResourceSurfaceProjectionIdentityV1 = (value) => JSON.stringify(canonicalizeFinancialSavingsJsonValue({
74
+ ...value,
75
+ providerAccountRefs: [...value.providerAccountRefs].sort(),
76
+ coordinates: [...value.coordinates].sort((left, right) => left.coordinateId.localeCompare(right.coordinateId)),
77
+ resources: [...value.resources]
78
+ .sort((left, right) => left.resourceId.localeCompare(right.resourceId))
79
+ .map(resource => ({
80
+ ...resource,
81
+ values: [...resource.values]
82
+ .sort((left, right) => left.coordinateId.localeCompare(right.coordinateId))
83
+ .map(canonicalizeValue),
84
+ ...(resource.scenarios === undefined
85
+ ? {}
86
+ : {
87
+ scenarios: [...resource.scenarios]
88
+ .sort((left, right) => left.scenarioId.localeCompare(right.scenarioId) || left.coordinateId.localeCompare(right.coordinateId))
89
+ .map(canonicalizeScenario),
90
+ }),
91
+ })),
92
+ }));
93
+ export const createFinancialResourceSurfaceProjectionIdV1 = (value) => `sha256:${sha256Utf8(canonicalizeFinancialResourceSurfaceProjectionIdentityV1(value))}`;
94
+ /**
95
+ * Selects one resource member without copying unrelated members or coordinates.
96
+ * The returned projection remains independently content-addressed and valid.
97
+ */
98
+ export const projectFinancialResourceSurfaceMemberV1 = (source, resourceId) => {
99
+ if (!isFinancialResourceSurfaceProjectionV1(source)) {
100
+ throw new TypeError('Invalid FinancialResourceSurfaceProjectionV1.');
101
+ }
102
+ const normalizedResourceId = resourceId.trim().toLowerCase().replace(/\/+$/, '');
103
+ const member = source.resources.find(candidate => candidate.resourceId.trim().toLowerCase().replace(/\/+$/, '') === normalizedResourceId);
104
+ if (!member)
105
+ return undefined;
106
+ const coordinateIds = new Set([
107
+ ...member.values.map(value => value.coordinateId),
108
+ ...(member.scenarios ?? []).map(scenario => scenario.coordinateId),
109
+ ]);
110
+ const identity = {
111
+ schemaVersion: source.schemaVersion,
112
+ contractVersion: source.contractVersion,
113
+ provider: source.provider,
114
+ providerAccountRefs: [...source.providerAccountRefs],
115
+ artifactGeneration: source.artifactGeneration,
116
+ financialAuthorityId: source.financialAuthorityId,
117
+ coordinates: source.coordinates.filter(coordinate => coordinateIds.has(coordinate.coordinateId)),
118
+ resources: [member],
119
+ };
120
+ const projection = {
121
+ ...identity,
122
+ projectionId: createFinancialResourceSurfaceProjectionIdV1(identity),
123
+ };
124
+ if (!isFinancialResourceSurfaceProjectionV1(projection)) {
125
+ throw new TypeError('Invalid projected FinancialResourceSurfaceProjectionV1.');
126
+ }
127
+ return projection;
128
+ };
129
+ /**
130
+ * Removes mutable recommendation scenarios while preserving authoritative
131
+ * current-spend values. Used when lifecycle state is newer than the immutable
132
+ * financial artifact.
133
+ */
134
+ export const projectFinancialResourceSurfaceWithoutScenariosV1 = (source) => {
135
+ if (!isFinancialResourceSurfaceProjectionV1(source)) {
136
+ throw new TypeError('Invalid FinancialResourceSurfaceProjectionV1.');
137
+ }
138
+ const referencedCoordinateIds = new Set(source.resources.flatMap(resource => resource.values.map(value => value.coordinateId)));
139
+ const identity = {
140
+ schemaVersion: source.schemaVersion,
141
+ contractVersion: source.contractVersion,
142
+ provider: source.provider,
143
+ providerAccountRefs: [...source.providerAccountRefs],
144
+ artifactGeneration: source.artifactGeneration,
145
+ financialAuthorityId: source.financialAuthorityId,
146
+ coordinates: source.coordinates.filter(coordinate => referencedCoordinateIds.has(coordinate.coordinateId)),
147
+ resources: source.resources.map(resource => {
148
+ const { scenarios: _scenarios, ...currentSpendOnly } = resource;
149
+ return currentSpendOnly;
150
+ }),
151
+ };
152
+ const projection = {
153
+ ...identity,
154
+ projectionId: createFinancialResourceSurfaceProjectionIdV1(identity),
155
+ };
156
+ if (!isFinancialResourceSurfaceProjectionV1(projection)) {
157
+ throw new TypeError('Invalid current-spend-only FinancialResourceSurfaceProjectionV1.');
158
+ }
159
+ return projection;
160
+ };
161
+ export const isFinancialResourceSurfaceProjectionV1 = (value) => {
162
+ if (!isFinancialSavingsRecord(value) ||
163
+ !hasExactFinancialSavingsFields(value, [
164
+ 'schemaVersion',
165
+ 'contractVersion',
166
+ 'projectionId',
167
+ 'provider',
168
+ 'providerAccountRefs',
169
+ 'artifactGeneration',
170
+ 'financialAuthorityId',
171
+ 'coordinates',
172
+ 'resources',
173
+ ]) ||
174
+ value.schemaVersion !== FINANCIAL_RESOURCE_SURFACE_PROJECTION_SCHEMA_VERSION_V1 ||
175
+ value.contractVersion !== FINANCIAL_RESOURCE_SURFACE_PROJECTION_CONTRACT_VERSION_V1 ||
176
+ !isFinancialSavingsHash(value.projectionId) ||
177
+ value.provider !== 'azure' ||
178
+ !Array.isArray(value.providerAccountRefs) ||
179
+ value.providerAccountRefs.length === 0 ||
180
+ value.providerAccountRefs.length > 64 ||
181
+ !value.providerAccountRefs.every(isFinancialSavingsIdentity) ||
182
+ new Set(value.providerAccountRefs).size !== value.providerAccountRefs.length ||
183
+ !isFinancialSavingsRecord(value.artifactGeneration) ||
184
+ !hasExactFinancialSavingsFields(value.artifactGeneration, ['runId', 'generatedAt']) ||
185
+ !isFinancialSavingsIdentity(value.artifactGeneration.runId) ||
186
+ !isFinancialSavingsIsoInstant(value.artifactGeneration.generatedAt) ||
187
+ !isFinancialSavingsHash(value.financialAuthorityId) ||
188
+ !Array.isArray(value.coordinates) ||
189
+ value.coordinates.length === 0 ||
190
+ value.coordinates.length > MAX_COORDINATES ||
191
+ !value.coordinates.every(isFinancialSurfaceCoordinateDefinitionV1) ||
192
+ new Set(value.coordinates.map(coordinate => coordinate.coordinateId)).size !== value.coordinates.length ||
193
+ !Array.isArray(value.resources) ||
194
+ value.resources.length > MAX_RESOURCES)
195
+ return false;
196
+ const coordinateById = new Map(value.coordinates.map(coordinate => [coordinate.coordinateId, coordinate]));
197
+ const coordinateIds = new Set(coordinateById.keys());
198
+ const resourceIds = new Set();
199
+ for (const resource of value.resources) {
200
+ if (!isFinancialSavingsRecord(resource) ||
201
+ !hasExactFinancialSavingsFields(resource, ['resourceId', 'resourceType', 'financialRole', 'values'], ['scenarios']) ||
202
+ !isFinancialSavingsIdentity(resource.resourceId) ||
203
+ resourceIds.has(resource.resourceId.toLowerCase()) ||
204
+ !isFinancialSavingsIdentity(resource.resourceType) ||
205
+ typeof resource.financialRole !== 'string' ||
206
+ !RESOURCE_ROLES.has(resource.financialRole) ||
207
+ !Array.isArray(resource.values) ||
208
+ resource.values.length === 0 ||
209
+ resource.values.length > MAX_VALUES_PER_RESOURCE)
210
+ return false;
211
+ resourceIds.add(resource.resourceId.toLowerCase());
212
+ const valueCoordinates = new Set();
213
+ for (const memberValue of resource.values) {
214
+ if (!isFinancialSavingsRecord(memberValue) || !isFinancialSavingsHash(memberValue.coordinateId))
215
+ return false;
216
+ const definition = coordinateById.get(memberValue.coordinateId);
217
+ if (definition === undefined || valueCoordinates.has(memberValue.coordinateId))
218
+ return false;
219
+ const money = Object.fromEntries(Object.entries(memberValue).filter(([key]) => key !== 'coordinateId'));
220
+ if (!isFinancialSurfaceMoneyV1(money, definition.requestedCurrencyCode))
221
+ return false;
222
+ valueCoordinates.add(memberValue.coordinateId);
223
+ }
224
+ if (resource.scenarios !== undefined) {
225
+ if (!Array.isArray(resource.scenarios) || resource.scenarios.length > MAX_SCENARIOS_PER_RESOURCE)
226
+ return false;
227
+ const scenarioCoordinates = new Set();
228
+ for (const scenario of resource.scenarios) {
229
+ if (!isFinancialSavingsRecord(scenario) || !isFinancialSavingsHash(scenario.coordinateId))
230
+ return false;
231
+ const definition = coordinateById.get(scenario.coordinateId);
232
+ if (definition === undefined ||
233
+ !isScenario(scenario, coordinateIds, definition.requestedCurrencyCode) ||
234
+ scenarioCoordinates.has(`${scenario.scenarioId}\u0000${scenario.coordinateId}`))
235
+ return false;
236
+ scenarioCoordinates.add(`${scenario.scenarioId}\u0000${scenario.coordinateId}`);
237
+ }
238
+ }
239
+ }
240
+ const projection = value;
241
+ const { projectionId: _projectionId, ...identity } = projection;
242
+ return projection.projectionId === createFinancialResourceSurfaceProjectionIdV1(identity);
243
+ };
@@ -1,4 +1,5 @@
1
1
  export const FINANCIAL_SAVINGS_AUTHORITY_SCHEMA_VERSION_V1 = 1;
2
2
  export const FINANCIAL_SAVINGS_AUTHORITY_CONTRACT_VERSION_V1 = 'financial-savings-authority/v1';
3
+ export const FINANCIAL_SAVINGS_RESOURCE_PROJECTION_CONTRACT_VERSION_V1 = 'financial-savings-resource-projection/v1';
3
4
  export const FINANCIAL_ELIGIBILITY_ASSESSMENT_SCHEMA_VERSION_V1 = 1;
4
5
  export const FINANCIAL_ELIGIBILITY_ASSESSMENT_CONTRACT_VERSION_V1 = 'financial-eligibility-assessment/v1';