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

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 (453) hide show
  1. package/README.md +3 -0
  2. package/dist/accounts/accounts.d.ts +13 -0
  3. package/dist/accounts/accounts.d.ts.map +1 -1
  4. package/dist/accounts/azureSpSetup.d.ts +5 -0
  5. package/dist/accounts/azureSpSetup.d.ts.map +1 -1
  6. package/dist/accounts/azureSpSetup.js.map +1 -1
  7. package/dist/accounts/index.d.ts +1 -0
  8. package/dist/accounts/index.d.ts.map +1 -1
  9. package/dist/accounts/index.js +1 -0
  10. package/dist/accounts/index.js.map +1 -1
  11. package/dist/accounts/subscriptionWriteAccess.d.ts +76 -0
  12. package/dist/accounts/subscriptionWriteAccess.d.ts.map +1 -0
  13. package/dist/accounts/subscriptionWriteAccess.js +119 -0
  14. package/dist/accounts/subscriptionWriteAccess.js.map +1 -0
  15. package/dist/accounts/writePermissions.d.ts +17 -1
  16. package/dist/accounts/writePermissions.d.ts.map +1 -1
  17. package/dist/accounts/writePermissions.js +47 -1
  18. package/dist/accounts/writePermissions.js.map +1 -1
  19. package/dist/ai/followUps.d.ts +16 -0
  20. package/dist/ai/followUps.d.ts.map +1 -0
  21. package/dist/ai/followUps.js +21 -0
  22. package/dist/ai/followUps.js.map +1 -0
  23. package/dist/ai/grounding.d.ts +42 -5
  24. package/dist/ai/grounding.d.ts.map +1 -1
  25. package/dist/ai/grounding.js +76 -8
  26. package/dist/ai/grounding.js.map +1 -1
  27. package/dist/ai/index.d.ts +4 -0
  28. package/dist/ai/index.d.ts.map +1 -1
  29. package/dist/ai/index.js +1 -0
  30. package/dist/ai/index.js.map +1 -1
  31. package/dist/aws/commitments-planning.d.ts +1 -1
  32. package/dist/aws/commitments-planning.d.ts.map +1 -1
  33. package/dist/aws/commitments-planning.js +1 -0
  34. package/dist/aws/commitments-planning.js.map +1 -1
  35. package/dist/aws/commitmentsPlanningValidation.d.ts +1 -1
  36. package/dist/aws/commitmentsPlanningValidation.d.ts.map +1 -1
  37. package/dist/aws/commitmentsPlanningValidation.js +26 -25
  38. package/dist/aws/commitmentsPlanningValidation.js.map +1 -1
  39. package/dist/aws/commitmentsPlanningView.d.ts +49 -0
  40. package/dist/aws/commitmentsPlanningView.d.ts.map +1 -0
  41. package/dist/aws/{pluginPublicArtifactEvidence.js → commitmentsPlanningView.js} +1 -1
  42. package/dist/aws/commitmentsPlanningView.js.map +1 -0
  43. package/dist/aws/index.d.ts +2 -14
  44. package/dist/aws/index.d.ts.map +1 -1
  45. package/dist/aws/index.js +2 -13
  46. package/dist/aws/index.js.map +1 -1
  47. package/dist/aws/organizationCommitments.d.ts +2 -1
  48. package/dist/aws/organizationCommitments.d.ts.map +1 -1
  49. package/dist/aws/organizationCommitments.js +2 -2
  50. package/dist/aws/organizationCommitments.js.map +1 -1
  51. package/dist/aws/organizationCommitmentsApiValidation.d.ts.map +1 -1
  52. package/dist/aws/organizationCommitmentsApiValidation.js +64 -64
  53. package/dist/aws/organizationCommitmentsApiValidation.js.map +1 -1
  54. package/dist/aws/organizationCommitmentsValidation.d.ts.map +1 -1
  55. package/dist/aws/organizationCommitmentsValidation.js +45 -44
  56. package/dist/aws/organizationCommitmentsValidation.js.map +1 -1
  57. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.d.ts.map +1 -1
  58. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.js +79 -76
  59. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.js.map +1 -1
  60. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.d.ts +1 -2
  61. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.d.ts.map +1 -1
  62. package/dist/aws/portalOrganizationCommitmentsPlanningPublicArtifacts.js.map +1 -1
  63. package/dist/aws/publicArtifacts.d.ts +2 -37
  64. package/dist/aws/publicArtifacts.d.ts.map +1 -1
  65. package/dist/aws/publicArtifacts.js +3 -1
  66. package/dist/aws/publicArtifacts.js.map +1 -1
  67. package/dist/aws/relationships.d.ts +5 -3
  68. package/dist/aws/relationships.d.ts.map +1 -1
  69. package/dist/aws/relationships.js +18 -3
  70. package/dist/aws/relationships.js.map +1 -1
  71. package/dist/aws/requests.d.ts +35 -3
  72. package/dist/aws/requests.d.ts.map +1 -1
  73. package/dist/aws/requests.js +5 -3
  74. package/dist/aws/requests.js.map +1 -1
  75. package/dist/aws/resourceGraph.d.ts +14 -0
  76. package/dist/aws/resourceGraph.d.ts.map +1 -0
  77. package/dist/aws/resourceGraph.js +68 -0
  78. package/dist/aws/resourceGraph.js.map +1 -0
  79. package/dist/aws/validationHelpers.d.ts +8 -0
  80. package/dist/aws/validationHelpers.d.ts.map +1 -0
  81. package/dist/aws/validationHelpers.js +54 -0
  82. package/dist/aws/validationHelpers.js.map +1 -0
  83. package/dist/azure/commitmentsPlanning.d.ts +15 -46
  84. package/dist/azure/commitmentsPlanning.d.ts.map +1 -1
  85. package/dist/azure/commitmentsPlanning.js +9 -0
  86. package/dist/azure/commitmentsPlanning.js.map +1 -1
  87. package/dist/azure/commitmentsPlanningValidation.d.ts +18 -0
  88. package/dist/azure/commitmentsPlanningValidation.d.ts.map +1 -0
  89. package/dist/azure/commitmentsPlanningValidation.js +50 -0
  90. package/dist/azure/commitmentsPlanningValidation.js.map +1 -0
  91. package/dist/azure/dataProtection.d.ts +40 -0
  92. package/dist/azure/dataProtection.d.ts.map +1 -1
  93. package/dist/azure/governance.d.ts +5 -0
  94. package/dist/azure/governance.d.ts.map +1 -1
  95. package/dist/azure/metrics.d.ts +2 -27
  96. package/dist/azure/metrics.d.ts.map +1 -1
  97. package/dist/azure/payloads.d.ts +24 -0
  98. package/dist/azure/payloads.d.ts.map +1 -1
  99. package/dist/azure/payloads.js +87 -0
  100. package/dist/azure/payloads.js.map +1 -1
  101. package/dist/azure/recommendationTracks.d.ts +1 -1
  102. package/dist/azure/recommendationTracks.d.ts.map +1 -1
  103. package/dist/azure/reportEvidence.d.ts +192 -11
  104. package/dist/azure/reportEvidence.d.ts.map +1 -1
  105. package/dist/azure/reportEvidence.js +9 -1
  106. package/dist/azure/reportEvidence.js.map +1 -1
  107. package/dist/azure/reportEvidenceValidation.d.ts.map +1 -1
  108. package/dist/azure/reportEvidenceValidation.js +201 -5
  109. package/dist/azure/reportEvidenceValidation.js.map +1 -1
  110. package/dist/azure/reportEvidenceValidationHelpers.d.ts +3 -16
  111. package/dist/azure/reportEvidenceValidationHelpers.d.ts.map +1 -1
  112. package/dist/azure/reportEvidenceValidationHelpers.js +80 -92
  113. package/dist/azure/reportEvidenceValidationHelpers.js.map +1 -1
  114. package/dist/azure/resilienceFacts.d.ts +100 -0
  115. package/dist/azure/resilienceFacts.d.ts.map +1 -0
  116. package/dist/azure/resilienceFacts.js +20 -0
  117. package/dist/azure/resilienceFacts.js.map +1 -0
  118. package/dist/azure/resilienceFactsValidation.d.ts +4 -0
  119. package/dist/azure/resilienceFactsValidation.d.ts.map +1 -0
  120. package/dist/azure/resilienceFactsValidation.js +70 -0
  121. package/dist/azure/resilienceFactsValidation.js.map +1 -0
  122. package/dist/azure/savings.d.ts +4 -2
  123. package/dist/azure/savings.d.ts.map +1 -1
  124. package/dist/azure/serviceRetirement.d.ts +21 -2
  125. package/dist/azure/serviceRetirement.d.ts.map +1 -1
  126. package/dist/azure/views.d.ts +24 -1
  127. package/dist/azure/views.d.ts.map +1 -1
  128. package/dist/azure/views.js.map +1 -1
  129. package/dist/common/boundedRows.d.ts +7 -0
  130. package/dist/common/boundedRows.d.ts.map +1 -0
  131. package/dist/{scheduler/scheduler.js → common/boundedRows.js} +1 -1
  132. package/dist/common/boundedRows.js.map +1 -0
  133. package/dist/common/index.d.ts +3 -0
  134. package/dist/common/index.d.ts.map +1 -1
  135. package/dist/common/index.js +3 -0
  136. package/dist/common/index.js.map +1 -1
  137. package/dist/common/metricStats.d.ts +29 -0
  138. package/dist/common/metricStats.d.ts.map +1 -0
  139. package/dist/{scheduler/bastionSchedule.js → common/metricStats.js} +1 -1
  140. package/dist/common/metricStats.js.map +1 -0
  141. package/dist/common/provider.d.ts +2 -0
  142. package/dist/common/provider.d.ts.map +1 -1
  143. package/dist/common/relationships.d.ts +3 -3
  144. package/dist/common/relationships.d.ts.map +1 -1
  145. package/dist/common/resourceGraph.d.ts +137 -0
  146. package/dist/common/resourceGraph.d.ts.map +1 -0
  147. package/dist/common/resourceGraph.js +17 -0
  148. package/dist/common/resourceGraph.js.map +1 -0
  149. package/dist/common/resourceGraphValidation.d.ts +30 -0
  150. package/dist/common/resourceGraphValidation.d.ts.map +1 -0
  151. package/dist/common/resourceGraphValidation.js +369 -0
  152. package/dist/common/resourceGraphValidation.js.map +1 -0
  153. package/dist/common/resourceIdentity.d.ts +28 -0
  154. package/dist/common/resourceIdentity.d.ts.map +1 -0
  155. package/dist/common/resourceIdentity.js +35 -0
  156. package/dist/common/resourceIdentity.js.map +1 -0
  157. package/dist/common/sha256.d.ts +2 -0
  158. package/dist/common/sha256.d.ts.map +1 -1
  159. package/dist/common/sha256.js +3 -0
  160. package/dist/common/sha256.js.map +1 -1
  161. package/dist/common/utilizationStories.d.ts +695 -0
  162. package/dist/common/utilizationStories.d.ts.map +1 -0
  163. package/dist/common/utilizationStories.js +21 -0
  164. package/dist/common/utilizationStories.js.map +1 -0
  165. package/dist/common/utilizationStoriesValidation.d.ts +60 -0
  166. package/dist/common/utilizationStoriesValidation.d.ts.map +1 -0
  167. package/dist/common/utilizationStoriesValidation.js +762 -0
  168. package/dist/common/utilizationStoriesValidation.js.map +1 -0
  169. package/dist/common/validationHelpers.d.ts +37 -0
  170. package/dist/common/validationHelpers.d.ts.map +1 -0
  171. package/dist/common/validationHelpers.js +147 -0
  172. package/dist/common/validationHelpers.js.map +1 -0
  173. package/dist/esm/accounts/index.js +1 -0
  174. package/dist/esm/accounts/subscriptionWriteAccess.js +112 -0
  175. package/dist/esm/accounts/writePermissions.js +46 -0
  176. package/dist/esm/ai/followUps.js +16 -0
  177. package/dist/esm/ai/grounding.js +74 -7
  178. package/dist/esm/ai/index.js +1 -0
  179. package/dist/esm/aws/commitments-planning.js +1 -0
  180. package/dist/esm/aws/commitmentsPlanningValidation.js +2 -1
  181. package/dist/esm/aws/index.js +2 -13
  182. package/dist/esm/aws/organizationCommitments.js +2 -2
  183. package/dist/esm/aws/organizationCommitmentsApiValidation.js +5 -5
  184. package/dist/esm/aws/organizationCommitmentsValidation.js +2 -1
  185. package/dist/esm/aws/portalOrganizationCommitmentsPlanningPublicArtifactValidation.js +8 -5
  186. package/dist/esm/aws/publicArtifacts.js +2 -0
  187. package/dist/esm/aws/relationships.js +4 -1
  188. package/dist/esm/aws/requests.js +4 -2
  189. package/dist/esm/aws/resourceGraph.js +63 -0
  190. package/dist/esm/aws/validationHelpers.js +46 -0
  191. package/dist/esm/azure/commitmentsPlanning.js +8 -1
  192. package/dist/esm/azure/commitmentsPlanningValidation.js +39 -0
  193. package/dist/esm/azure/payloads.js +84 -1
  194. package/dist/esm/azure/reportEvidence.js +8 -0
  195. package/dist/esm/azure/reportEvidenceValidation.js +202 -6
  196. package/dist/esm/azure/reportEvidenceValidationHelpers.js +7 -19
  197. package/dist/esm/azure/resilienceFacts.js +16 -0
  198. package/dist/esm/azure/resilienceFactsValidation.js +64 -0
  199. package/dist/esm/common/index.js +3 -0
  200. package/dist/esm/common/resourceGraph.js +13 -0
  201. package/dist/esm/common/resourceGraphValidation.js +365 -0
  202. package/dist/esm/common/resourceIdentity.js +24 -0
  203. package/dist/esm/common/sha256.js +2 -0
  204. package/dist/esm/common/utilizationStories.js +17 -0
  205. package/dist/esm/common/utilizationStoriesValidation.js +718 -0
  206. package/dist/esm/common/validationHelpers.js +115 -0
  207. package/dist/esm/entries/relationships.js +2 -2
  208. package/dist/esm/index.js +5 -0
  209. package/dist/esm/index.vite.js +1 -0
  210. package/dist/esm/reporting/jobs/index.js +13 -0
  211. package/dist/esm/reporting/jobs/reportJobIdentity.js +76 -0
  212. package/dist/esm/reporting/jobs/reportJobMessages.js +47 -0
  213. package/dist/esm/reporting/jobs/reportJobRow.js +264 -0
  214. package/dist/esm/reporting/jobs/reportJobSpec.js +295 -0
  215. package/dist/esm/reporting/jobs/reportJobStatus.js +87 -0
  216. package/dist/esm/reporting/shared/reportTableEntities.js +41 -0
  217. package/dist/esm/reporting/shared/reportingDigest.js +57 -0
  218. package/dist/esm/reporting/shared/reportingIds.js +88 -0
  219. package/dist/esm/reporting/shared/reportingPaths.js +23 -0
  220. package/dist/esm/scheduler/index.js +4 -4
  221. package/dist/esm/scheduler/resourceStrategy.js +2 -0
  222. package/dist/esm/scheduler/resourceStrategyCapabilityValidation.js +265 -0
  223. package/dist/esm/scheduler/resourceStrategyContracts.js +20 -0
  224. package/dist/esm/scheduler/resourceStrategyFinancialValidation.js +145 -0
  225. package/dist/esm/scheduler/resourceStrategyPermissionValidation.js +190 -0
  226. package/dist/esm/scheduler/resourceStrategyScheduleValidation.js +506 -0
  227. package/dist/esm/scheduler/resourceStrategyValidation.js +4 -0
  228. package/dist/esm/scheduler/resourceStrategyValidationShared.js +261 -0
  229. package/dist/esm/scheduler/schedulerValidation.js +372 -0
  230. package/dist/esm/scheduler/weeklyAvailabilityFixtures.js +140 -0
  231. package/dist/index.d.ts +5 -0
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +5 -0
  234. package/dist/index.js.map +1 -1
  235. package/dist/index.vite.d.ts +1 -0
  236. package/dist/index.vite.d.ts.map +1 -1
  237. package/dist/index.vite.js +1 -0
  238. package/dist/index.vite.js.map +1 -1
  239. package/dist/reporting/jobs/index.d.ts +14 -0
  240. package/dist/reporting/jobs/index.d.ts.map +1 -0
  241. package/dist/reporting/jobs/index.js +45 -0
  242. package/dist/reporting/jobs/index.js.map +1 -0
  243. package/dist/reporting/jobs/reportJobIdentity.d.ts +44 -0
  244. package/dist/reporting/jobs/reportJobIdentity.d.ts.map +1 -0
  245. package/dist/reporting/jobs/reportJobIdentity.js +88 -0
  246. package/dist/reporting/jobs/reportJobIdentity.js.map +1 -0
  247. package/dist/reporting/jobs/reportJobMessages.d.ts +30 -0
  248. package/dist/reporting/jobs/reportJobMessages.d.ts.map +1 -0
  249. package/dist/reporting/jobs/reportJobMessages.js +54 -0
  250. package/dist/reporting/jobs/reportJobMessages.js.map +1 -0
  251. package/dist/reporting/jobs/reportJobRow.d.ts +98 -0
  252. package/dist/reporting/jobs/reportJobRow.d.ts.map +1 -0
  253. package/dist/reporting/jobs/reportJobRow.js +270 -0
  254. package/dist/reporting/jobs/reportJobRow.js.map +1 -0
  255. package/dist/reporting/jobs/reportJobSpec.d.ts +92 -0
  256. package/dist/reporting/jobs/reportJobSpec.d.ts.map +1 -0
  257. package/dist/reporting/jobs/reportJobSpec.js +304 -0
  258. package/dist/reporting/jobs/reportJobSpec.js.map +1 -0
  259. package/dist/reporting/jobs/reportJobStatus.d.ts +60 -0
  260. package/dist/reporting/jobs/reportJobStatus.d.ts.map +1 -0
  261. package/dist/reporting/jobs/reportJobStatus.js +98 -0
  262. package/dist/reporting/jobs/reportJobStatus.js.map +1 -0
  263. package/dist/reporting/shared/reportTableEntities.d.ts +23 -0
  264. package/dist/reporting/shared/reportTableEntities.d.ts.map +1 -0
  265. package/dist/reporting/shared/reportTableEntities.js +47 -0
  266. package/dist/reporting/shared/reportTableEntities.js.map +1 -0
  267. package/dist/reporting/shared/reportingDigest.d.ts +6 -0
  268. package/dist/reporting/shared/reportingDigest.d.ts.map +1 -0
  269. package/dist/reporting/shared/reportingDigest.js +63 -0
  270. package/dist/reporting/shared/reportingDigest.js.map +1 -0
  271. package/dist/reporting/shared/reportingIds.d.ts +34 -0
  272. package/dist/reporting/shared/reportingIds.d.ts.map +1 -0
  273. package/dist/reporting/shared/reportingIds.js +102 -0
  274. package/dist/reporting/shared/reportingIds.js.map +1 -0
  275. package/dist/reporting/shared/reportingPaths.d.ts +14 -0
  276. package/dist/reporting/shared/reportingPaths.d.ts.map +1 -0
  277. package/dist/reporting/shared/reportingPaths.js +29 -0
  278. package/dist/reporting/shared/reportingPaths.js.map +1 -0
  279. package/dist/scheduler/index.d.ts +4 -4
  280. package/dist/scheduler/index.d.ts.map +1 -1
  281. package/dist/scheduler/index.js +4 -4
  282. package/dist/scheduler/index.js.map +1 -1
  283. package/dist/scheduler/resourceStrategy.d.ts +3 -0
  284. package/dist/scheduler/resourceStrategy.d.ts.map +1 -0
  285. package/dist/scheduler/resourceStrategy.js +19 -0
  286. package/dist/scheduler/resourceStrategy.js.map +1 -0
  287. package/dist/scheduler/resourceStrategyCapabilityValidation.d.ts +4 -0
  288. package/dist/scheduler/resourceStrategyCapabilityValidation.d.ts.map +1 -0
  289. package/dist/scheduler/resourceStrategyCapabilityValidation.js +270 -0
  290. package/dist/scheduler/resourceStrategyCapabilityValidation.js.map +1 -0
  291. package/dist/scheduler/resourceStrategyContracts.d.ts +466 -0
  292. package/dist/scheduler/resourceStrategyContracts.d.ts.map +1 -0
  293. package/dist/scheduler/resourceStrategyContracts.js +24 -0
  294. package/dist/scheduler/resourceStrategyContracts.js.map +1 -0
  295. package/dist/scheduler/resourceStrategyFinancialValidation.d.ts +5 -0
  296. package/dist/scheduler/resourceStrategyFinancialValidation.d.ts.map +1 -0
  297. package/dist/scheduler/resourceStrategyFinancialValidation.js +151 -0
  298. package/dist/scheduler/resourceStrategyFinancialValidation.js.map +1 -0
  299. package/dist/scheduler/resourceStrategyPermissionValidation.d.ts +4 -0
  300. package/dist/scheduler/resourceStrategyPermissionValidation.d.ts.map +1 -0
  301. package/dist/scheduler/resourceStrategyPermissionValidation.js +195 -0
  302. package/dist/scheduler/resourceStrategyPermissionValidation.js.map +1 -0
  303. package/dist/scheduler/resourceStrategyScheduleValidation.d.ts +14 -0
  304. package/dist/scheduler/resourceStrategyScheduleValidation.d.ts.map +1 -0
  305. package/dist/scheduler/resourceStrategyScheduleValidation.js +519 -0
  306. package/dist/scheduler/resourceStrategyScheduleValidation.js.map +1 -0
  307. package/dist/scheduler/resourceStrategyValidation.d.ts +5 -0
  308. package/dist/scheduler/resourceStrategyValidation.d.ts.map +1 -0
  309. package/dist/scheduler/resourceStrategyValidation.js +21 -0
  310. package/dist/scheduler/resourceStrategyValidation.js.map +1 -0
  311. package/dist/scheduler/resourceStrategyValidationShared.d.ts +19 -0
  312. package/dist/scheduler/resourceStrategyValidationShared.d.ts.map +1 -0
  313. package/dist/scheduler/resourceStrategyValidationShared.js +281 -0
  314. package/dist/scheduler/resourceStrategyValidationShared.js.map +1 -0
  315. package/dist/scheduler/schedulerContracts.d.ts +184 -0
  316. package/dist/scheduler/schedulerContracts.d.ts.map +1 -0
  317. package/dist/{aws/portalPublicArtifactNestedEvidence.js → scheduler/schedulerContracts.js} +1 -1
  318. package/dist/scheduler/schedulerContracts.js.map +1 -0
  319. package/dist/scheduler/schedulerValidation.d.ts +15 -0
  320. package/dist/scheduler/schedulerValidation.d.ts.map +1 -0
  321. package/dist/scheduler/schedulerValidation.js +388 -0
  322. package/dist/scheduler/schedulerValidation.js.map +1 -0
  323. package/dist/scheduler/weeklyAvailabilityFixtures.d.ts +26 -0
  324. package/dist/scheduler/weeklyAvailabilityFixtures.d.ts.map +1 -0
  325. package/dist/scheduler/weeklyAvailabilityFixtures.js +144 -0
  326. package/dist/scheduler/weeklyAvailabilityFixtures.js.map +1 -0
  327. package/package.json +26 -7
  328. package/dist/aws/pluginPublicArtifactBodyValidation.d.ts +0 -10
  329. package/dist/aws/pluginPublicArtifactBodyValidation.d.ts.map +0 -1
  330. package/dist/aws/pluginPublicArtifactBodyValidation.js +0 -225
  331. package/dist/aws/pluginPublicArtifactBodyValidation.js.map +0 -1
  332. package/dist/aws/pluginPublicArtifactEvidence.d.ts +0 -161
  333. package/dist/aws/pluginPublicArtifactEvidence.d.ts.map +0 -1
  334. package/dist/aws/pluginPublicArtifactEvidence.js.map +0 -1
  335. package/dist/aws/pluginPublicArtifactManifestValidation.d.ts +0 -4
  336. package/dist/aws/pluginPublicArtifactManifestValidation.d.ts.map +0 -1
  337. package/dist/aws/pluginPublicArtifactManifestValidation.js +0 -259
  338. package/dist/aws/pluginPublicArtifactManifestValidation.js.map +0 -1
  339. package/dist/aws/pluginPublicArtifactSectionValidation.d.ts +0 -6
  340. package/dist/aws/pluginPublicArtifactSectionValidation.d.ts.map +0 -1
  341. package/dist/aws/pluginPublicArtifactSectionValidation.js +0 -471
  342. package/dist/aws/pluginPublicArtifactSectionValidation.js.map +0 -1
  343. package/dist/aws/pluginPublicArtifactValidation.d.ts +0 -3
  344. package/dist/aws/pluginPublicArtifactValidation.d.ts.map +0 -1
  345. package/dist/aws/pluginPublicArtifactValidation.js +0 -9
  346. package/dist/aws/pluginPublicArtifactValidation.js.map +0 -1
  347. package/dist/aws/pluginPublicArtifactValidationHelpers.d.ts +0 -23
  348. package/dist/aws/pluginPublicArtifactValidationHelpers.d.ts.map +0 -1
  349. package/dist/aws/pluginPublicArtifactValidationHelpers.js +0 -240
  350. package/dist/aws/pluginPublicArtifactValidationHelpers.js.map +0 -1
  351. package/dist/aws/pluginPublicArtifacts.d.ts +0 -253
  352. package/dist/aws/pluginPublicArtifacts.d.ts.map +0 -1
  353. package/dist/aws/pluginPublicArtifacts.js +0 -51
  354. package/dist/aws/pluginPublicArtifacts.js.map +0 -1
  355. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.d.ts +0 -4
  356. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.d.ts.map +0 -1
  357. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.js +0 -513
  358. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.js.map +0 -1
  359. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.d.ts +0 -13
  360. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.d.ts.map +0 -1
  361. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.js +0 -5
  362. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.js.map +0 -1
  363. package/dist/aws/portalPublicArtifactCurrentValidation.d.ts +0 -4
  364. package/dist/aws/portalPublicArtifactCurrentValidation.d.ts.map +0 -1
  365. package/dist/aws/portalPublicArtifactCurrentValidation.js +0 -333
  366. package/dist/aws/portalPublicArtifactCurrentValidation.js.map +0 -1
  367. package/dist/aws/portalPublicArtifactEvidenceValidation.d.ts +0 -6
  368. package/dist/aws/portalPublicArtifactEvidenceValidation.d.ts.map +0 -1
  369. package/dist/aws/portalPublicArtifactEvidenceValidation.js +0 -301
  370. package/dist/aws/portalPublicArtifactEvidenceValidation.js.map +0 -1
  371. package/dist/aws/portalPublicArtifactHistoryAiValidation.d.ts +0 -8
  372. package/dist/aws/portalPublicArtifactHistoryAiValidation.d.ts.map +0 -1
  373. package/dist/aws/portalPublicArtifactHistoryAiValidation.js +0 -377
  374. package/dist/aws/portalPublicArtifactHistoryAiValidation.js.map +0 -1
  375. package/dist/aws/portalPublicArtifactHistoryTypes.d.ts +0 -178
  376. package/dist/aws/portalPublicArtifactHistoryTypes.d.ts.map +0 -1
  377. package/dist/aws/portalPublicArtifactHistoryTypes.js +0 -44
  378. package/dist/aws/portalPublicArtifactHistoryTypes.js.map +0 -1
  379. package/dist/aws/portalPublicArtifactNestedEvidence.d.ts +0 -127
  380. package/dist/aws/portalPublicArtifactNestedEvidence.d.ts.map +0 -1
  381. package/dist/aws/portalPublicArtifactNestedEvidence.js.map +0 -1
  382. package/dist/aws/portalPublicArtifactNestedEvidenceValidation.d.ts +0 -6
  383. package/dist/aws/portalPublicArtifactNestedEvidenceValidation.d.ts.map +0 -1
  384. package/dist/aws/portalPublicArtifactNestedEvidenceValidation.js +0 -405
  385. package/dist/aws/portalPublicArtifactNestedEvidenceValidation.js.map +0 -1
  386. package/dist/aws/portalPublicArtifactValidation.d.ts +0 -3
  387. package/dist/aws/portalPublicArtifactValidation.d.ts.map +0 -1
  388. package/dist/aws/portalPublicArtifactValidation.js +0 -14
  389. package/dist/aws/portalPublicArtifactValidation.js.map +0 -1
  390. package/dist/aws/portalPublicArtifactValidationCommon.d.ts +0 -30
  391. package/dist/aws/portalPublicArtifactValidationCommon.d.ts.map +0 -1
  392. package/dist/aws/portalPublicArtifactValidationCommon.js +0 -167
  393. package/dist/aws/portalPublicArtifactValidationCommon.js.map +0 -1
  394. package/dist/aws/portalPublicArtifacts.d.ts +0 -400
  395. package/dist/aws/portalPublicArtifacts.d.ts.map +0 -1
  396. package/dist/aws/portalPublicArtifacts.js +0 -85
  397. package/dist/aws/portalPublicArtifacts.js.map +0 -1
  398. package/dist/aws/portalRelationshipPublicArtifactValidation.d.ts +0 -4
  399. package/dist/aws/portalRelationshipPublicArtifactValidation.d.ts.map +0 -1
  400. package/dist/aws/portalRelationshipPublicArtifactValidation.js +0 -338
  401. package/dist/aws/portalRelationshipPublicArtifactValidation.js.map +0 -1
  402. package/dist/aws/portalRelationshipPublicArtifacts.d.ts +0 -196
  403. package/dist/aws/portalRelationshipPublicArtifacts.d.ts.map +0 -1
  404. package/dist/aws/portalRelationshipPublicArtifacts.js +0 -63
  405. package/dist/aws/portalRelationshipPublicArtifacts.js.map +0 -1
  406. package/dist/aws/portalRelationshipResourceNodeTypes.d.ts +0 -269
  407. package/dist/aws/portalRelationshipResourceNodeTypes.d.ts.map +0 -1
  408. package/dist/aws/portalRelationshipResourceNodeTypes.js +0 -3
  409. package/dist/aws/portalRelationshipResourceNodeTypes.js.map +0 -1
  410. package/dist/aws/portalRelationshipResourceNodeValidation.d.ts +0 -2
  411. package/dist/aws/portalRelationshipResourceNodeValidation.d.ts.map +0 -1
  412. package/dist/aws/portalRelationshipResourceNodeValidation.js +0 -372
  413. package/dist/aws/portalRelationshipResourceNodeValidation.js.map +0 -1
  414. package/dist/esm/aws/pluginPublicArtifactBodyValidation.js +0 -217
  415. package/dist/esm/aws/pluginPublicArtifactManifestValidation.js +0 -255
  416. package/dist/esm/aws/pluginPublicArtifactSectionValidation.js +0 -464
  417. package/dist/esm/aws/pluginPublicArtifactValidation.js +0 -2
  418. package/dist/esm/aws/pluginPublicArtifactValidationHelpers.js +0 -216
  419. package/dist/esm/aws/pluginPublicArtifacts.js +0 -44
  420. package/dist/esm/aws/portalCommitmentsPlanningPublicArtifactValidation.js +0 -509
  421. package/dist/esm/aws/portalCommitmentsPlanningPublicArtifacts.js +0 -1
  422. package/dist/esm/aws/portalPublicArtifactCurrentValidation.js +0 -328
  423. package/dist/esm/aws/portalPublicArtifactEvidenceValidation.js +0 -294
  424. package/dist/esm/aws/portalPublicArtifactHistoryAiValidation.js +0 -368
  425. package/dist/esm/aws/portalPublicArtifactHistoryTypes.js +0 -40
  426. package/dist/esm/aws/portalPublicArtifactNestedEvidenceValidation.js +0 -397
  427. package/dist/esm/aws/portalPublicArtifactValidation.js +0 -2
  428. package/dist/esm/aws/portalPublicArtifactValidationCommon.js +0 -139
  429. package/dist/esm/aws/portalPublicArtifacts.js +0 -73
  430. package/dist/esm/aws/portalRelationshipPublicArtifactValidation.js +0 -334
  431. package/dist/esm/aws/portalRelationshipPublicArtifacts.js +0 -59
  432. package/dist/esm/aws/portalRelationshipResourceNodeValidation.js +0 -368
  433. package/dist/esm/scheduler/bastionScheduleProfile.js +0 -206
  434. package/dist/esm/scheduler/bastionScheduleValidation.js +0 -401
  435. package/dist/esm/scheduler/scheduler.js +0 -1
  436. package/dist/scheduler/bastionSchedule.d.ts +0 -113
  437. package/dist/scheduler/bastionSchedule.d.ts.map +0 -1
  438. package/dist/scheduler/bastionSchedule.js.map +0 -1
  439. package/dist/scheduler/bastionScheduleProfile.d.ts +0 -24
  440. package/dist/scheduler/bastionScheduleProfile.d.ts.map +0 -1
  441. package/dist/scheduler/bastionScheduleProfile.js +0 -210
  442. package/dist/scheduler/bastionScheduleProfile.js.map +0 -1
  443. package/dist/scheduler/bastionScheduleValidation.d.ts +0 -10
  444. package/dist/scheduler/bastionScheduleValidation.d.ts.map +0 -1
  445. package/dist/scheduler/bastionScheduleValidation.js +0 -412
  446. package/dist/scheduler/bastionScheduleValidation.js.map +0 -1
  447. package/dist/scheduler/scheduler.d.ts +0 -267
  448. package/dist/scheduler/scheduler.d.ts.map +0 -1
  449. package/dist/scheduler/scheduler.js.map +0 -1
  450. /package/dist/esm/aws/{pluginPublicArtifactEvidence.js → commitmentsPlanningView.js} +0 -0
  451. /package/dist/esm/{aws/portalPublicArtifactNestedEvidence.js → common/boundedRows.js} +0 -0
  452. /package/dist/esm/{aws/portalRelationshipResourceNodeTypes.js → common/metricStats.js} +0 -0
  453. /package/dist/esm/scheduler/{bastionSchedule.js → schedulerContracts.js} +0 -0
@@ -0,0 +1,365 @@
1
+ import { CAPABILITY_REASON_CODES } from './capabilityPassport.js';
2
+ import { RESOURCE_GRAPH_EDGE_CONFIDENCES, RESOURCE_GRAPH_EDGE_KINDS, RESOURCE_GRAPH_EVIDENCE_METHODS, RESOURCE_GRAPH_NODE_KINDS, RESOURCE_GRAPH_NODE_ROLES, RESOURCE_GRAPH_SCHEMA_VERSION, } from './resourceGraph.js';
3
+ import { isAttributeKey, isAttributeScalar, isKebabIdentifier } from './resourceIdentity.js';
4
+ import { asArray, asRecord, assertExactKeys, assertPlainJson, assertUnique, assertValue, finiteNumber, isoTimestamp, nonNegativeInteger, requiredBoolean, requiredEnum, requiredString, validateGeneration, } from './validationHelpers.js';
5
+ const ARTIFACT_KEYS = [
6
+ 'schemaVersion',
7
+ 'provider',
8
+ 'accountId',
9
+ 'artifactGeneration',
10
+ 'generatedAt',
11
+ 'scope',
12
+ 'currency',
13
+ 'currencySymbol',
14
+ 'nodes',
15
+ 'edges',
16
+ 'unresolved',
17
+ 'coverage',
18
+ 'stats',
19
+ ];
20
+ const NODE_KEYS = [
21
+ 'id',
22
+ 'kind',
23
+ 'family',
24
+ 'resourceType',
25
+ 'syntheticType',
26
+ 'region',
27
+ 'name',
28
+ 'displayName',
29
+ 'icon',
30
+ 'nativeId',
31
+ 'role',
32
+ 'tags',
33
+ 'attributes',
34
+ 'costs',
35
+ ];
36
+ /** Node fields each kind may carry; anything else is rejected. */
37
+ const NODE_FIELDS = {
38
+ scope: ['nativeId', 'attributes'],
39
+ region: [],
40
+ zone: ['nativeId', 'attributes'],
41
+ group: ['family', 'nativeId', 'role', 'tags', 'attributes'],
42
+ resource: ['family', 'resourceType', 'nativeId', 'role', 'tags', 'attributes', 'costs'],
43
+ synthetic: ['family', 'syntheticType', 'nativeId', 'role', 'tags', 'attributes'],
44
+ };
45
+ /** Allowed `contains` parents: containment is strictly downward, so the graph stays acyclic. */
46
+ const CONTAINMENT_PARENTS = {
47
+ scope: [],
48
+ region: ['scope'],
49
+ zone: ['region'],
50
+ group: ['region', 'zone'],
51
+ resource: ['region', 'zone', 'group'],
52
+ synthetic: ['region', 'zone', 'group'],
53
+ };
54
+ const DEPENDENCY_KINDS = ['group', 'resource', 'synthetic'];
55
+ /**
56
+ * Validates one untrusted resource graph artifact. It checks structure and
57
+ * identifier formats only; families are never checked against a service list.
58
+ */
59
+ export function validateResourceGraphArtifact(value, options) {
60
+ const artifact = asRecord(value, 'artifact');
61
+ assertExactKeys(artifact, ARTIFACT_KEYS, 'artifact');
62
+ assertValue(artifact.schemaVersion, RESOURCE_GRAPH_SCHEMA_VERSION, 'artifact.schemaVersion');
63
+ assertValue(artifact.provider, options.provider, 'artifact.provider');
64
+ const accountId = requiredString(artifact.accountId, 'artifact.accountId');
65
+ if (options.isAccountId && !options.isAccountId(accountId))
66
+ throw new Error('artifact.accountId is not a valid provider account id.');
67
+ const generation = validateGeneration(artifact.artifactGeneration, 'artifact.artifactGeneration');
68
+ const outputAt = Date.parse(generation.generatedAt);
69
+ const generatedAt = isoTimestamp(artifact.generatedAt, 'artifact.generatedAt');
70
+ if (Date.parse(generatedAt) > outputAt)
71
+ throw new Error('artifact.generatedAt must not be newer than the artifact generation.');
72
+ const regions = validateScope(artifact.scope, options);
73
+ if (artifact.currency !== undefined)
74
+ requiredString(artifact.currency, 'artifact.currency');
75
+ if (artifact.currencySymbol !== undefined)
76
+ requiredString(artifact.currencySymbol, 'artifact.currencySymbol');
77
+ const nodes = validateNodes(artifact.nodes, accountId, regions, options);
78
+ if (nodes.hasCosts && artifact.currency === undefined)
79
+ throw new Error('artifact.currency is required when nodes carry costs.');
80
+ const edgeCount = validateEdges(artifact.edges, nodes.byId);
81
+ const unresolvedCount = validateUnresolved(artifact.unresolved, nodes.byId);
82
+ validateCoverage(artifact.coverage, regions, outputAt, nodes.byId);
83
+ validateStats(artifact.stats, nodes.byId.size, edgeCount, unresolvedCount);
84
+ assertPublicGraphJson(artifact, options.isForbiddenKey);
85
+ return value;
86
+ }
87
+ function validateScope(value, options) {
88
+ const scope = asRecord(value, 'artifact.scope');
89
+ assertExactKeys(scope, ['regions'], 'artifact.scope');
90
+ const regions = asArray(scope.regions, 'artifact.scope.regions', true).map((region, index) => {
91
+ const field = `artifact.scope.regions[${index}]`;
92
+ const name = requiredString(region, field);
93
+ if (options.isRegion && !options.isRegion(name))
94
+ throw new Error(`${field} is not a valid provider Region.`);
95
+ return name;
96
+ });
97
+ assertUnique(regions, 'artifact.scope.regions');
98
+ return new Set(regions);
99
+ }
100
+ function validateNodes(value, accountId, regions, options) {
101
+ const byId = new Map();
102
+ const regionNodes = [];
103
+ let scopeCount = 0;
104
+ let hasCosts = false;
105
+ asArray(value, 'artifact.nodes').forEach((entry, index) => {
106
+ const field = `artifact.nodes[${index}]`;
107
+ const node = asRecord(entry, field);
108
+ assertExactKeys(node, NODE_KEYS, field);
109
+ const id = requiredString(node.id, `${field}.id`);
110
+ if (byId.has(id))
111
+ throw new Error('artifact node ids must be unique.');
112
+ const kind = requiredEnum(node.kind, RESOURCE_GRAPH_NODE_KINDS, `${field}.kind`);
113
+ const allowed = NODE_FIELDS[kind];
114
+ const undeclared = ['family', 'resourceType', 'syntheticType', 'nativeId', 'role', 'tags', 'attributes', 'costs'].filter(key => node[key] !== undefined && !allowed.includes(key));
115
+ if (undeclared.length > 0)
116
+ throw new Error(`${field} ${kind} nodes must not carry: ${undeclared.join(', ')}.`);
117
+ requiredString(node.name, `${field}.name`);
118
+ if (node.displayName !== undefined)
119
+ requiredString(node.displayName, `${field}.displayName`);
120
+ if (node.icon !== undefined)
121
+ requiredString(node.icon, `${field}.icon`);
122
+ let region;
123
+ if (kind === 'scope') {
124
+ scopeCount += 1;
125
+ if (node.region !== undefined)
126
+ throw new Error(`${field}.region is not allowed on the scope node.`);
127
+ }
128
+ else {
129
+ region = requiredString(node.region, `${field}.region`);
130
+ if (!regions.has(region))
131
+ throw new Error(`${field}.region is outside artifact scope.`);
132
+ }
133
+ if (kind === 'region')
134
+ regionNodes.push(region);
135
+ if (kind === 'zone')
136
+ options.validateZone?.(String(node.name), region, `${field}.name`);
137
+ if (kind === 'resource' || node.family !== undefined)
138
+ kebab(node.family, `${field}.family`);
139
+ if (kind === 'resource') {
140
+ const resourceType = requiredString(node.resourceType, `${field}.resourceType`);
141
+ if (options.isResourceType && !options.isResourceType(resourceType))
142
+ throw new Error(`${field}.resourceType is not a valid provider resource type.`);
143
+ }
144
+ if (kind === 'synthetic')
145
+ kebab(node.syntheticType, `${field}.syntheticType`);
146
+ if (node.role !== undefined)
147
+ requiredEnum(node.role, RESOURCE_GRAPH_NODE_ROLES, `${field}.role`);
148
+ const scope = { accountId, region };
149
+ if (node.nativeId !== undefined)
150
+ options.validateNativeId?.(requiredString(node.nativeId, `${field}.nativeId`), scope, `${field}.nativeId`);
151
+ if (node.tags !== undefined)
152
+ validateTags(node.tags, `${field}.tags`);
153
+ if (node.attributes !== undefined)
154
+ validateAttributes(node.attributes, scope, options, `${field}.attributes`);
155
+ if (node.costs !== undefined) {
156
+ validateCosts(node.costs, `${field}.costs`);
157
+ hasCosts = true;
158
+ }
159
+ byId.set(id, { kind, region, family: node.family === undefined ? undefined : String(node.family) });
160
+ });
161
+ if (scopeCount !== 1)
162
+ throw new Error('artifact must contain exactly one scope node.');
163
+ assertUnique(regionNodes, 'artifact Region nodes');
164
+ if (regionNodes.length !== regions.size)
165
+ throw new Error('artifact Region nodes must exactly match artifact scope Regions.');
166
+ return { byId, hasCosts };
167
+ }
168
+ function kebab(value, field) {
169
+ if (!isKebabIdentifier(value))
170
+ throw new Error(`${field} must be a kebab-case identifier.`);
171
+ return value;
172
+ }
173
+ function validateTags(value, field) {
174
+ Object.entries(asRecord(value, field)).forEach(([key, tagValue]) => {
175
+ if (key.length === 0)
176
+ throw new Error(`${field} keys must be non-empty.`);
177
+ if (typeof tagValue !== 'string')
178
+ throw new Error(`${field}.${key} must be a string.`);
179
+ });
180
+ }
181
+ function validateAttributes(value, scope, options, field) {
182
+ Object.entries(asRecord(value, field)).forEach(([key, item]) => {
183
+ const itemField = `${field}.${key}`;
184
+ if (!isAttributeKey(key))
185
+ throw new Error(`${itemField} key must be camelCase.`);
186
+ validateAttributeValue(item, itemField);
187
+ options.validateAttribute?.(key, item, scope, itemField);
188
+ });
189
+ }
190
+ function validateAttributeValue(value, field) {
191
+ if (isAttributeScalar(value))
192
+ return;
193
+ if (!Array.isArray(value))
194
+ throw new Error(`${field} must be a scalar, a scalar array, or an array of flat records.`);
195
+ if (value.every(isAttributeScalar))
196
+ return;
197
+ value.forEach((entry, index) => {
198
+ const entryField = `${field}[${index}]`;
199
+ Object.entries(asRecord(entry, entryField)).forEach(([key, item]) => {
200
+ if (!isAttributeKey(key))
201
+ throw new Error(`${entryField}.${key} key must be camelCase.`);
202
+ if (!isAttributeScalar(item))
203
+ throw new Error(`${entryField}.${key} must be a string, finite number, or boolean.`);
204
+ });
205
+ });
206
+ }
207
+ function validateCosts(value, field) {
208
+ const costs = asRecord(value, field);
209
+ assertExactKeys(costs, ['spend30d', 'spend30dAmortized'], field);
210
+ if (Object.keys(costs).length === 0)
211
+ throw new Error(`${field} must report at least one amount.`);
212
+ Object.entries(costs).forEach(([key, amount]) => finiteNumber(amount, `${field}.${key}`));
213
+ }
214
+ function validateEdges(value, nodes) {
215
+ const edges = asArray(value, 'artifact.edges');
216
+ const ids = new Set();
217
+ const parents = new Map();
218
+ edges.forEach((entry, index) => {
219
+ const field = `artifact.edges[${index}]`;
220
+ const edge = asRecord(entry, field);
221
+ assertExactKeys(edge, ['id', 'from', 'to', 'kind', 'relationshipTypes', 'confidence', 'evidence'], field);
222
+ const id = requiredString(edge.id, `${field}.id`);
223
+ if (ids.has(id))
224
+ throw new Error('artifact edge ids must be unique.');
225
+ ids.add(id);
226
+ const from = requiredString(edge.from, `${field}.from`);
227
+ const to = requiredString(edge.to, `${field}.to`);
228
+ const child = nodes.get(from);
229
+ const parent = nodes.get(to);
230
+ if (!child || !parent)
231
+ throw new Error(`${field} references a missing node.`);
232
+ if (from === to)
233
+ throw new Error(`${field} must not be a self edge.`);
234
+ const kind = requiredEnum(edge.kind, RESOURCE_GRAPH_EDGE_KINDS, `${field}.kind`);
235
+ const relationshipTypes = asArray(edge.relationshipTypes, `${field}.relationshipTypes`, true).map((type, typeIndex) => kebab(type, `${field}.relationshipTypes[${typeIndex}]`));
236
+ assertUnique(relationshipTypes, `${field}.relationshipTypes`);
237
+ requiredEnum(edge.confidence, RESOURCE_GRAPH_EDGE_CONFIDENCES, `${field}.confidence`);
238
+ validateEvidence(edge.evidence, `${field}.evidence`);
239
+ if (kind === 'contains') {
240
+ if (!CONTAINMENT_PARENTS[child.kind].includes(parent.kind))
241
+ throw new Error(`${field} ${child.kind} nodes cannot be contained by ${parent.kind} nodes; contains edges point child to parent.`);
242
+ if (parent.region !== undefined && child.region !== parent.region)
243
+ throw new Error(`${field} containment must not cross Regions.`);
244
+ parents.set(from, (parents.get(from) ?? 0) + 1);
245
+ }
246
+ else if (!DEPENDENCY_KINDS.includes(child.kind) || !DEPENDENCY_KINDS.includes(parent.kind)) {
247
+ throw new Error(`${field} depends_on edges must connect group, resource, or synthetic nodes.`);
248
+ }
249
+ });
250
+ nodes.forEach((node, id) => {
251
+ const expected = node.kind === 'scope' ? 0 : 1;
252
+ if ((parents.get(id) ?? 0) !== expected)
253
+ throw new Error(`artifact node ${id} must have exactly ${expected} contains parent edge${expected === 1 ? '' : 's'}.`);
254
+ });
255
+ return edges.length;
256
+ }
257
+ function validateEvidence(value, field) {
258
+ asArray(value, field, true).forEach((entry, index) => {
259
+ const itemField = `${field}[${index}]`;
260
+ const item = asRecord(entry, itemField);
261
+ assertExactKeys(item, ['method', 'sourceFamily', 'field', 'matchedValue'], itemField);
262
+ requiredEnum(item.method, RESOURCE_GRAPH_EVIDENCE_METHODS, `${itemField}.method`);
263
+ kebab(item.sourceFamily, `${itemField}.sourceFamily`);
264
+ if (item.field !== undefined)
265
+ requiredString(item.field, `${itemField}.field`);
266
+ if (item.matchedValue !== undefined)
267
+ requiredString(item.matchedValue, `${itemField}.matchedValue`);
268
+ });
269
+ }
270
+ function validateUnresolved(value, nodes) {
271
+ const unresolved = asArray(value, 'artifact.unresolved');
272
+ unresolved.forEach((entry, index) => {
273
+ const field = `artifact.unresolved[${index}]`;
274
+ const reference = asRecord(entry, field);
275
+ assertExactKeys(reference, ['sourceNodeId', 'relationshipType', 'sourceFamily', 'field', 'matchedValue', 'expectedTargetFamily'], field);
276
+ const source = nodes.get(requiredString(reference.sourceNodeId, `${field}.sourceNodeId`));
277
+ if (!source)
278
+ throw new Error(`${field}.sourceNodeId references a missing node.`);
279
+ kebab(reference.relationshipType, `${field}.relationshipType`);
280
+ const sourceFamily = kebab(reference.sourceFamily, `${field}.sourceFamily`);
281
+ if (source.family !== undefined && source.family !== sourceFamily)
282
+ throw new Error(`${field}.sourceFamily must match its source node family.`);
283
+ requiredString(reference.field, `${field}.field`);
284
+ requiredString(reference.matchedValue, `${field}.matchedValue`);
285
+ kebab(reference.expectedTargetFamily, `${field}.expectedTargetFamily`);
286
+ });
287
+ return unresolved.length;
288
+ }
289
+ /** Coverage is self-closing: it must declare every family that appears on a resource node. */
290
+ function validateCoverage(value, regions, outputAt, nodes) {
291
+ const coverage = asRecord(value, 'artifact.coverage');
292
+ assertExactKeys(coverage, ['families'], 'artifact.coverage');
293
+ const declared = new Map();
294
+ asArray(coverage.families, 'artifact.coverage.families').forEach((entry, index) => {
295
+ const field = `artifact.coverage.families[${index}]`;
296
+ const family = asRecord(entry, field);
297
+ assertExactKeys(family, ['family', 'regions', 'status', 'lastSuccessfulRefreshAt', 'emptyScope', 'reason'], field);
298
+ const name = kebab(family.family, `${field}.family`);
299
+ if (declared.has(name))
300
+ throw new Error('artifact.coverage family identities must not contain duplicates.');
301
+ const familyRegions = asArray(family.regions, `${field}.regions`, true).map((region, regionIndex) => requiredString(region, `${field}.regions[${regionIndex}]`));
302
+ assertUnique(familyRegions, `${field}.regions`);
303
+ if (familyRegions.some(region => !regions.has(region)))
304
+ throw new Error(`${field}.regions must be within artifact scope Regions.`);
305
+ let emptyScope = false;
306
+ if (requiredEnum(family.status, ['available', 'incomplete'], `${field}.status`) === 'available') {
307
+ const refreshedAt = isoTimestamp(family.lastSuccessfulRefreshAt, `${field}.lastSuccessfulRefreshAt`);
308
+ if (Date.parse(refreshedAt) > outputAt)
309
+ throw new Error(`${field}.lastSuccessfulRefreshAt must not be newer than the artifact generation.`);
310
+ emptyScope = requiredBoolean(family.emptyScope, `${field}.emptyScope`);
311
+ if (family.reason !== undefined)
312
+ throw new Error(`${field}.reason is not allowed for available coverage.`);
313
+ }
314
+ else {
315
+ requiredEnum(family.reason, CAPABILITY_REASON_CODES, `${field}.reason`);
316
+ if (family.lastSuccessfulRefreshAt !== undefined || family.emptyScope !== undefined)
317
+ throw new Error(`${field} incomplete coverage cannot claim successful refresh evidence.`);
318
+ }
319
+ declared.set(name, { regions: new Set(familyRegions), emptyScope });
320
+ });
321
+ nodes.forEach((node, id) => {
322
+ if (node.kind !== 'resource')
323
+ return;
324
+ const family = declared.get(node.family);
325
+ if (!family)
326
+ throw new Error(`artifact.coverage must declare family ${node.family} of resource node ${id}.`);
327
+ if (!family.regions.has(node.region))
328
+ throw new Error(`artifact.coverage for ${node.family} must include Region ${node.region}.`);
329
+ if (family.emptyScope)
330
+ throw new Error(`artifact.coverage for ${node.family} claims an empty scope but resource node ${id} exists.`);
331
+ });
332
+ }
333
+ function validateStats(value, nodeCount, edgeCount, unresolvedCount) {
334
+ const stats = asRecord(value, 'artifact.stats');
335
+ assertExactKeys(stats, ['totalNodes', 'totalEdges', 'unresolvedCount', 'truncated', 'truncation', 'buildMs', 'snapshotBytes'], 'artifact.stats');
336
+ assertValue(nonNegativeInteger(stats.totalNodes, 'artifact.stats.totalNodes'), nodeCount, 'artifact.stats.totalNodes');
337
+ assertValue(nonNegativeInteger(stats.totalEdges, 'artifact.stats.totalEdges'), edgeCount, 'artifact.stats.totalEdges');
338
+ assertValue(nonNegativeInteger(stats.unresolvedCount, 'artifact.stats.unresolvedCount'), unresolvedCount, 'artifact.stats.unresolvedCount');
339
+ if (requiredBoolean(stats.truncated, 'artifact.stats.truncated')) {
340
+ const truncation = asRecord(stats.truncation, 'artifact.stats.truncation');
341
+ const counts = ['edgesDroppedCount', 'unresolvedDroppedCount', 'tagsRemovedFromNodeCount'];
342
+ assertExactKeys(truncation, ['reason', ...counts], 'artifact.stats.truncation');
343
+ assertValue(truncation.reason, 'snapshot-size-limit', 'artifact.stats.truncation.reason');
344
+ if (counts.map(key => nonNegativeInteger(truncation[key], `artifact.stats.truncation.${key}`)).every(count => count === 0))
345
+ throw new Error('artifact.stats.truncation must report at least one omitted item.');
346
+ }
347
+ else if (stats.truncation !== undefined) {
348
+ throw new Error('artifact.stats.truncation is only allowed when truncated is true.');
349
+ }
350
+ if (stats.buildMs !== undefined)
351
+ nonNegativeInteger(stats.buildMs, 'artifact.stats.buildMs');
352
+ if (stats.snapshotBytes !== undefined)
353
+ nonNegativeInteger(stats.snapshotBytes, 'artifact.stats.snapshotBytes');
354
+ }
355
+ /** Rejects non-plain JSON everywhere, applying the provider key guard with attribute context. */
356
+ function assertPublicGraphJson(artifact, isForbiddenKey) {
357
+ const { nodes, ...envelope } = artifact;
358
+ assertPlainJson(envelope, 'artifact', key => isForbiddenKey?.(key, false) ?? false);
359
+ nodes.forEach((node, index) => {
360
+ const { attributes, ...rest } = node;
361
+ assertPlainJson(rest, `artifact.nodes[${index}]`, key => isForbiddenKey?.(key, false) ?? false);
362
+ if (attributes !== undefined)
363
+ assertPlainJson(attributes, `artifact.nodes[${index}].attributes`, key => isForbiddenKey?.(key, true) ?? false);
364
+ });
365
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Provider-neutral resource identity vocabulary.
3
+ *
4
+ * Families, relationship types, and synthetic types are open kebab-case
5
+ * identifiers so a provider can add a service without a package change.
6
+ * Validators check identifier format only, never membership in a list.
7
+ */
8
+ export const KEBAB_IDENTIFIER_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
9
+ export const ATTRIBUTE_KEY_PATTERN = /^[a-z][A-Za-z0-9]*$/;
10
+ export const isKebabIdentifier = (value) => typeof value === 'string' && KEBAB_IDENTIFIER_PATTERN.test(value);
11
+ export const isResourceFamilyId = (value) => isKebabIdentifier(value);
12
+ export const isCapabilitySourceId = (value) => isKebabIdentifier(value);
13
+ export const isAttributeKey = (value) => typeof value === 'string' && ATTRIBUTE_KEY_PATTERN.test(value);
14
+ export const isAttributeScalar = (value) => typeof value === 'string' || typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value));
15
+ const isPlainRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
16
+ const isAttributeRecord = (value) => isPlainRecord(value) && Object.entries(value).every(([key, item]) => isAttributeKey(key) && isAttributeScalar(item));
17
+ export const isAttributeValue = (value) => {
18
+ if (isAttributeScalar(value))
19
+ return true;
20
+ if (!Array.isArray(value))
21
+ return false;
22
+ return value.every(isAttributeScalar) || value.every(isAttributeRecord);
23
+ };
24
+ export const isResourceAttributes = (value) => isPlainRecord(value) && Object.entries(value).every(([key, item]) => isAttributeKey(key) && isAttributeValue(item));
@@ -87,3 +87,5 @@ export function sha256Utf8(value) {
87
87
  }
88
88
  return state.map(word => (word >>> 0).toString(16).padStart(8, '0')).join('');
89
89
  }
90
+ /** Compatibility name used by provider-neutral identity helpers. */
91
+ export const sha256Hex = sha256Utf8;
@@ -0,0 +1,17 @@
1
+ export const STORY_KEYS = [
2
+ 'oversized-resources',
3
+ 'right-sku',
4
+ 'schedule-candidates',
5
+ 'resilience-recovery',
6
+ 'hybrid-benefit',
7
+ 'commitments',
8
+ ];
9
+ export const STORY_LIMITS = {
10
+ sectionRows: 1000,
11
+ sampleRows: 50,
12
+ windowDays: 30,
13
+ weeklyGridDays: 7,
14
+ weeklyGridHours: 24,
15
+ /** Story fingerprints retained per monthly history period (all stories together). */
16
+ historyFingerprints: 2000,
17
+ };