@intentius/chant-lexicon-aws 0.124.31 → 0.124.33

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 (649) hide show
  1. package/dist/actions/dynamodb.js +41 -0
  2. package/dist/actions/ecr.js +9 -0
  3. package/dist/actions/ecs.js +5 -0
  4. package/dist/actions/iam.js +3 -0
  5. package/dist/actions/index.js +9 -0
  6. package/dist/actions/lambda.js +11 -0
  7. package/dist/actions/logs.js +4 -0
  8. package/dist/actions/s3.js +40 -0
  9. package/dist/actions/sns.js +5 -0
  10. package/dist/actions/sqs.js +15 -0
  11. package/dist/agentcore/trace-fetch.d.ts.map +1 -1
  12. package/dist/agentcore/trace-fetch.js +472 -0
  13. package/dist/agentcore/trace-render.js +359 -0
  14. package/dist/ambient.js +148 -0
  15. package/dist/api/credential-chain.d.ts +30 -3
  16. package/dist/api/credential-chain.d.ts.map +1 -1
  17. package/dist/api/credential-chain.js +509 -0
  18. package/dist/api/read-client.d.ts +16 -43
  19. package/dist/api/read-client.d.ts.map +1 -1
  20. package/dist/api/read-client.js +458 -0
  21. package/dist/api/sigv4.d.ts +4 -4
  22. package/dist/api/sigv4.js +185 -0
  23. package/dist/behaviour-kinds.js +114 -0
  24. package/dist/caller-identity.d.ts +3 -5
  25. package/dist/caller-identity.d.ts.map +1 -1
  26. package/dist/caller-identity.js +146 -0
  27. package/dist/codegen/docs-cli.js +2 -0
  28. package/dist/codegen/docs.js +120 -0
  29. package/dist/codegen/enum-overlay.js +162 -0
  30. package/dist/codegen/extensions.js +139 -0
  31. package/dist/codegen/fallback.js +32 -0
  32. package/dist/codegen/generate-cli.js +15 -0
  33. package/dist/codegen/generate-lexicon.js +70 -0
  34. package/dist/codegen/generate-typescript.js +226 -0
  35. package/dist/codegen/generate.d.ts.map +1 -1
  36. package/dist/codegen/generate.js +234 -0
  37. package/dist/codegen/naming.js +135 -0
  38. package/dist/codegen/package.js +67 -0
  39. package/dist/codegen/patches.d.ts +26 -1
  40. package/dist/codegen/patches.d.ts.map +1 -1
  41. package/dist/codegen/patches.js +90 -0
  42. package/dist/codegen/property-overlay.js +85 -0
  43. package/dist/codegen/property-overlay.json +1 -16
  44. package/dist/codegen/sam.js +402 -0
  45. package/dist/codegen/typecheck.js +4 -0
  46. package/dist/codegen/versions.js +31 -0
  47. package/dist/components/__tests__/mock-cloud-executor.js +326 -0
  48. package/dist/components/apply.d.ts +44 -1
  49. package/dist/components/apply.d.ts.map +1 -1
  50. package/dist/components/apply.js +752 -0
  51. package/dist/components/builders.js +37 -0
  52. package/dist/components/capability-plugin.js +66 -0
  53. package/dist/components/cloud-executor.d.ts +35 -0
  54. package/dist/components/cloud-executor.d.ts.map +1 -1
  55. package/dist/components/cloud-executor.js +576 -0
  56. package/dist/components/config-bom.js +207 -0
  57. package/dist/components/host-delivery.js +117 -0
  58. package/dist/components/index.js +18 -0
  59. package/dist/components/job-submission.js +77 -0
  60. package/dist/components/publish.js +234 -0
  61. package/dist/components/safety.js +62 -0
  62. package/dist/components/wait-aws.js +68 -0
  63. package/dist/composites/agentcore-agent.js +187 -0
  64. package/dist/composites/agentcore-trust-policy.js +13 -0
  65. package/dist/composites/alb-shared.js +84 -0
  66. package/dist/composites/bucket-deployment.js +93 -0
  67. package/dist/composites/catalog.js +2714 -0
  68. package/dist/composites/dynamodb-table.js +66 -0
  69. package/dist/composites/ec2-instance-bundle.js +75 -0
  70. package/dist/composites/ec2-instance-role.js +26 -0
  71. package/dist/composites/ecr-repository.js +64 -0
  72. package/dist/composites/ecs-trust-policy.js +10 -0
  73. package/dist/composites/efs-with-access-point.js +44 -0
  74. package/dist/composites/eks-cluster.js +118 -0
  75. package/dist/composites/fargate-alb.js +216 -0
  76. package/dist/composites/fargate-service.js +222 -0
  77. package/dist/composites/index.js +28 -0
  78. package/dist/composites/lambda-api.js +15 -0
  79. package/dist/composites/lambda-dynamodb.js +77 -0
  80. package/dist/composites/lambda-eventbridge.js +27 -0
  81. package/dist/composites/lambda-function.js +54 -0
  82. package/dist/composites/lambda-s3.js +93 -0
  83. package/dist/composites/lambda-sns.js +23 -0
  84. package/dist/composites/lambda-sqs.js +34 -0
  85. package/dist/composites/landing-zone.js +82 -0
  86. package/dist/composites/microvm-app.js +293 -0
  87. package/dist/composites/minimal-vpc.js +40 -0
  88. package/dist/composites/monitoring-stack.js +105 -0
  89. package/dist/composites/nlb-service.js +61 -0
  90. package/dist/composites/rds-instance.js +98 -0
  91. package/dist/composites/scheduled-lambda.js +28 -0
  92. package/dist/composites/solr-fargate-service.js +33 -0
  93. package/dist/composites/step-functions-workflow.js +78 -0
  94. package/dist/composites/vpc-default.js +132 -0
  95. package/dist/condition.js +43 -0
  96. package/dist/coverage.js +4 -0
  97. package/dist/deep-observe.d.ts.map +1 -1
  98. package/dist/deep-observe.js +709 -0
  99. package/dist/deep-topology.js +226 -0
  100. package/dist/default-tags.js +50 -0
  101. package/dist/defaults.js +85 -0
  102. package/dist/dependencies.js +269 -0
  103. package/dist/detect.js +21 -0
  104. package/dist/disruption.d.ts.map +1 -1
  105. package/dist/disruption.js +129 -0
  106. package/dist/effect-receipt-row.js +107 -0
  107. package/dist/generated/index.d.ts +1297 -82
  108. package/dist/generated/index.d.ts.map +1 -1
  109. package/dist/generated/index.js +12382 -0
  110. package/dist/generated/runtime.js +4 -0
  111. package/dist/governance.js +131 -0
  112. package/dist/health.d.ts +61 -0
  113. package/dist/health.d.ts.map +1 -0
  114. package/dist/health.js +216 -0
  115. package/dist/identity-observe.d.ts.map +1 -1
  116. package/dist/identity-observe.js +127 -0
  117. package/dist/import/generator.js +757 -0
  118. package/dist/import/live-export.js +34 -0
  119. package/dist/import/parser.js +394 -0
  120. package/dist/index.js +69 -0
  121. package/dist/integrity.json +6 -6
  122. package/dist/intrinsics.js +393 -0
  123. package/dist/lint/audit-catalog.js +87 -0
  124. package/dist/lint/audit-lineage.js +150 -0
  125. package/dist/lint/post-synth/cf-refs.js +247 -0
  126. package/dist/lint/post-synth/cor020.js +60 -0
  127. package/dist/lint/post-synth/ext001.d.ts.map +1 -1
  128. package/dist/lint/post-synth/ext001.js +197 -0
  129. package/dist/lint/post-synth/index.js +124 -0
  130. package/dist/lint/post-synth/waw010.js +41 -0
  131. package/dist/lint/post-synth/waw011.js +41 -0
  132. package/dist/lint/post-synth/waw013.js +38 -0
  133. package/dist/lint/post-synth/waw014.js +42 -0
  134. package/dist/lint/post-synth/waw015.js +88 -0
  135. package/dist/lint/post-synth/waw016.d.ts.map +1 -1
  136. package/dist/lint/post-synth/waw016.js +116 -0
  137. package/dist/lint/post-synth/waw017.js +43 -0
  138. package/dist/lint/post-synth/waw018.js +61 -0
  139. package/dist/lint/post-synth/waw019.js +64 -0
  140. package/dist/lint/post-synth/waw020.js +56 -0
  141. package/dist/lint/post-synth/waw021.js +44 -0
  142. package/dist/lint/post-synth/waw022.js +36 -0
  143. package/dist/lint/post-synth/waw023.js +40 -0
  144. package/dist/lint/post-synth/waw024.js +46 -0
  145. package/dist/lint/post-synth/waw025.js +36 -0
  146. package/dist/lint/post-synth/waw026.js +38 -0
  147. package/dist/lint/post-synth/waw027.js +41 -0
  148. package/dist/lint/post-synth/waw028.js +39 -0
  149. package/dist/lint/post-synth/waw029.js +54 -0
  150. package/dist/lint/post-synth/waw030.js +282 -0
  151. package/dist/lint/post-synth/waw031.js +58 -0
  152. package/dist/lint/post-synth/waw032.js +45 -0
  153. package/dist/lint/post-synth/waw033.js +75 -0
  154. package/dist/lint/post-synth/waw034.js +52 -0
  155. package/dist/lint/post-synth/waw035.js +56 -0
  156. package/dist/lint/post-synth/waw036.js +79 -0
  157. package/dist/lint/post-synth/waw037.js +67 -0
  158. package/dist/lint/post-synth/waw038.js +42 -0
  159. package/dist/lint/post-synth/waw039.js +42 -0
  160. package/dist/lint/post-synth/waw040.js +45 -0
  161. package/dist/lint/post-synth/waw041.js +40 -0
  162. package/dist/lint/post-synth/waw042.js +99 -0
  163. package/dist/lint/post-synth/waw043.js +51 -0
  164. package/dist/lint/post-synth/waw044.js +64 -0
  165. package/dist/lint/post-synth/waw045.js +49 -0
  166. package/dist/lint/post-synth/waw046.js +52 -0
  167. package/dist/lint/post-synth/waw047.js +43 -0
  168. package/dist/lint/post-synth/waw048.js +40 -0
  169. package/dist/lint/post-synth/waw049.js +78 -0
  170. package/dist/lint/post-synth/waw050.js +44 -0
  171. package/dist/lint/post-synth/waw051.js +41 -0
  172. package/dist/lint/post-synth/waw052.js +43 -0
  173. package/dist/lint/post-synth/waw053.js +43 -0
  174. package/dist/lint/post-synth/waw054.js +41 -0
  175. package/dist/lint/post-synth/waw055.js +41 -0
  176. package/dist/lint/post-synth/waw056.js +65 -0
  177. package/dist/lint/post-synth/waw057.js +43 -0
  178. package/dist/lint/post-synth/waw058.js +61 -0
  179. package/dist/lint/post-synth/waw059.js +338 -0
  180. package/dist/lint/post-synth/waw060.js +83 -0
  181. package/dist/lint/post-synth/waw061.js +60 -0
  182. package/dist/lint/post-synth/waw062.js +0 -0
  183. package/dist/lint/post-synth/waw063.js +0 -0
  184. package/dist/lint/post-synth/waw064.js +45 -0
  185. package/dist/lint/post-synth/waw065.js +104 -0
  186. package/dist/lint/post-synth/waw066.js +145 -0
  187. package/dist/lint/post-synth/waw067.js +115 -0
  188. package/dist/lint/post-synth/waw068.js +69 -0
  189. package/dist/lint/post-synth/waw069.js +0 -0
  190. package/dist/lint/rules/hardcoded-region.js +38 -0
  191. package/dist/lint/rules/iam-wildcard.js +60 -0
  192. package/dist/lint/rules/index.js +6 -0
  193. package/dist/lint/rules/s3-encryption.js +60 -0
  194. package/dist/live-attrs.js +42 -0
  195. package/dist/lsp/completions.d.ts.map +1 -1
  196. package/dist/lsp/completions.js +18 -0
  197. package/dist/lsp/hover.d.ts.map +1 -1
  198. package/dist/lsp/hover.js +66 -0
  199. package/dist/manifest.json +1 -1
  200. package/dist/mapping.js +33 -0
  201. package/dist/meta.json +17359 -784
  202. package/dist/nested-stack.js +95 -0
  203. package/dist/okf/index.md +203 -0
  204. package/dist/okf/rules/EXT001.md +1 -0
  205. package/dist/okf/rules/WAW016.md +2 -0
  206. package/dist/okf/rules/WAW019.md +1 -0
  207. package/dist/okf/rules/WAW028.md +1 -0
  208. package/dist/okf/rules/WAW030.md +2 -0
  209. package/dist/okf/rules/WAW039.md +1 -0
  210. package/dist/okf/rules/WAW049.md +1 -0
  211. package/dist/okf/rules/WAW056.md +1 -0
  212. package/dist/okf/rules/WAW058.md +1 -0
  213. package/dist/okf/rules/WAW062.md +1 -0
  214. package/dist/okf/rules/WAW064.md +1 -0
  215. package/dist/okf/rules/WAW065.md +1 -0
  216. package/dist/okf/rules/WAW066.md +1 -0
  217. package/dist/okf/rules/WAW067.md +1 -0
  218. package/dist/okf/rules/WAW068.md +1 -0
  219. package/dist/okf/rules/WAW069.md +4 -0
  220. package/dist/okf/types/AIWorkloadConfig.md +23 -0
  221. package/dist/okf/types/ARCRegionSwitchPlan.md +1 -0
  222. package/dist/okf/types/AccountAccessApplication.md +28 -0
  223. package/dist/okf/types/AccountAccessEntitlement.md +22 -0
  224. package/dist/okf/types/ActionTarget.md +20 -0
  225. package/dist/okf/types/AdConfiguration.md +21 -0
  226. package/dist/okf/types/Adapter.md +26 -0
  227. package/dist/okf/types/AgentContext.md +35 -0
  228. package/dist/okf/types/AgentGoal.md +31 -0
  229. package/dist/okf/types/AgentProfile.md +34 -0
  230. package/dist/okf/types/Alarm.md +3 -1
  231. package/dist/okf/types/AlarmModel.md +14 -9
  232. package/dist/okf/types/AmplifyWebhook.md +25 -0
  233. package/dist/okf/types/ApiCache.md +8 -8
  234. package/dist/okf/types/ApiGatewayManagedOverrides.md +5 -5
  235. package/dist/okf/types/AppAuthorization.md +35 -0
  236. package/dist/okf/types/AppBlockBuilder.md +1 -0
  237. package/dist/okf/types/AppInstance.md +2 -2
  238. package/dist/okf/types/AppInstanceBot.md +2 -2
  239. package/dist/okf/types/AppStreamFleet.md +3 -2
  240. package/dist/okf/types/AppSyncApiKey.md +6 -6
  241. package/dist/okf/types/AppSyncType.md +22 -0
  242. package/dist/okf/types/ApplicationStatusCheck.md +36 -0
  243. package/dist/okf/types/ApplicationVersion.md +4 -1
  244. package/dist/okf/types/ApplicationsList.md +26 -0
  245. package/dist/okf/types/ApprovalPolicy.md +28 -0
  246. package/dist/okf/types/ArchiveRule.md +24 -0
  247. package/dist/okf/types/Asset.md +30 -0
  248. package/dist/okf/types/Backup.md +31 -0
  249. package/dist/okf/types/BedrockAgentCoreDataset.md +1 -1
  250. package/dist/okf/types/BedrockAgentCoreGateway.md +3 -0
  251. package/dist/okf/types/BedrockSession.md +28 -0
  252. package/dist/okf/types/BillEstimate.md +35 -0
  253. package/dist/okf/types/Brand.md +32 -0
  254. package/dist/okf/types/CallAnalyticsCategory.md +25 -0
  255. package/dist/okf/types/Campaign.md +28 -0
  256. package/dist/okf/types/CapacityProvider.md +30 -0
  257. package/dist/okf/types/Case.md +24 -0
  258. package/dist/okf/types/CertificateAssociation.md +13 -0
  259. package/dist/okf/types/ChangeSet.md +36 -0
  260. package/dist/okf/types/ChannelFlow.md +29 -0
  261. package/dist/okf/types/ChimeChannel.md +39 -0
  262. package/dist/okf/types/Classifier.md +6 -6
  263. package/dist/okf/types/ClientVpnAuthorizationRule.md +6 -6
  264. package/dist/okf/types/ClientVpnEndpoint.md +2 -0
  265. package/dist/okf/types/ClientVpnRoute.md +5 -5
  266. package/dist/okf/types/CloudConnector.md +29 -0
  267. package/dist/okf/types/Cluster.md +39 -0
  268. package/dist/okf/types/ClusterSchedulerConfig.md +30 -0
  269. package/dist/okf/types/CodeCommitRepository.md +12 -12
  270. package/dist/okf/types/CodeConnectionsHost.md +26 -0
  271. package/dist/okf/types/CodeRepository.md +5 -5
  272. package/dist/okf/types/CompositeAlarm.md +1 -0
  273. package/dist/okf/types/ComputeEnvironment.md +2 -0
  274. package/dist/okf/types/ComputeNodeGroup.md +1 -1
  275. package/dist/okf/types/ComputeQuota.md +34 -0
  276. package/dist/okf/types/ConfigRule.md +1 -1
  277. package/dist/okf/types/ConfigurationRecorder.md +7 -6
  278. package/dist/okf/types/ConnectAttachment.md +2 -0
  279. package/dist/okf/types/ConnectQueue.md +5 -1
  280. package/dist/okf/types/ConnectVocabulary.md +28 -0
  281. package/dist/okf/types/ConnectionType.md +24 -0
  282. package/dist/okf/types/ConsentPortal.md +33 -0
  283. package/dist/okf/types/ContactMethod.md +29 -0
  284. package/dist/okf/types/ContainerAssociation.md +26 -0
  285. package/dist/okf/types/ContainerFleet.md +1 -1
  286. package/dist/okf/types/ContainerGroupDefinition.md +1 -1
  287. package/dist/okf/types/Content.md +40 -0
  288. package/dist/okf/types/ContentAssociation.md +28 -0
  289. package/dist/okf/types/CustomDetectionRuleAssociation.md +28 -0
  290. package/dist/okf/types/CustomEntityType.md +4 -9
  291. package/dist/okf/types/Customization.md +22 -0
  292. package/dist/okf/types/CwIntegration.md +31 -0
  293. package/dist/okf/types/DAXParameterGroup.md +3 -8
  294. package/dist/okf/types/DAXSubnetGroup.md +0 -5
  295. package/dist/okf/types/DBClusterEndpoint.md +31 -0
  296. package/dist/okf/types/DBProxyTargetGroup.md +1 -0
  297. package/dist/okf/types/DBSnapshot.md +62 -0
  298. package/dist/okf/types/DLMLifecyclePolicy.md +12 -12
  299. package/dist/okf/types/DLPSetting.md +31 -0
  300. package/dist/okf/types/DMSInstanceProfile.md +1 -1
  301. package/dist/okf/types/DRSLaunchConfigurationTemplate.md +28 -0
  302. package/dist/okf/types/Daemon.md +1 -0
  303. package/dist/okf/types/DataExchangeDataSet.md +29 -0
  304. package/dist/okf/types/DataIntegrationFlow.md +27 -0
  305. package/dist/okf/types/DataMigration.md +1 -1
  306. package/dist/okf/types/DataProvider.md +2 -1
  307. package/dist/okf/types/DataQualityRuleset.md +6 -11
  308. package/dist/okf/types/DataSource.md +23 -0
  309. package/dist/okf/types/Dataset.md +20 -0
  310. package/dist/okf/types/DatasetIntegration.md +23 -0
  311. package/dist/okf/types/DbCluster.md +1 -1
  312. package/dist/okf/types/DbInstance.md +8 -2
  313. package/dist/okf/types/DeadlineBudget.md +29 -0
  314. package/dist/okf/types/DelegationSet.md +23 -0
  315. package/dist/okf/types/DeliveryChannel.md +6 -11
  316. package/dist/okf/types/DevOpsAgentAgentSpace.md +4 -0
  317. package/dist/okf/types/DevOpsAgentService.md +1 -0
  318. package/dist/okf/types/DevOpsAgentTrigger.md +28 -0
  319. package/dist/okf/types/DirectConnectGatewayAttachment.md +2 -0
  320. package/dist/okf/types/Directory.md +60 -0
  321. package/dist/okf/types/DocDBDBClusterParameterGroup.md +5 -10
  322. package/dist/okf/types/DocDBDBSubnetGroup.md +4 -9
  323. package/dist/okf/types/DocDBElasticClusterSnapshot.md +36 -0
  324. package/dist/okf/types/DocumentClassifierEndpoint.md +27 -0
  325. package/dist/okf/types/Domain.md +27 -0
  326. package/dist/okf/types/EKSCertificateAuthority.md +42 -0
  327. package/dist/okf/types/EKSCluster.md +8 -0
  328. package/dist/okf/types/EcSnapshot.md +66 -0
  329. package/dist/okf/types/EmailIdentityCertificate.md +15 -0
  330. package/dist/okf/types/EndpointConfig.md +14 -13
  331. package/dist/okf/types/EntityRecognizer.md +27 -0
  332. package/dist/okf/types/EntityRecognizerEndpoint.md +31 -0
  333. package/dist/okf/types/EnvironmentEC2.md +13 -13
  334. package/dist/okf/types/EvaluationForm.md +1 -0
  335. package/dist/okf/types/Evaluator.md +6 -2
  336. package/dist/okf/types/EventAction.md +26 -0
  337. package/dist/okf/types/EventRule.md +2 -0
  338. package/dist/okf/types/EventSource.md +30 -0
  339. package/dist/okf/types/EventTracker.md +22 -0
  340. package/dist/okf/types/EventsV2EventBus.md +28 -0
  341. package/dist/okf/types/EventsV2ResourcePolicy.md +19 -0
  342. package/dist/okf/types/EventsV2Subscriber.md +39 -0
  343. package/dist/okf/types/ExperimentDefinition.md +39 -0
  344. package/dist/okf/types/ExperimentRun.md +33 -0
  345. package/dist/okf/types/ExperimentTrialComponent.md +13 -11
  346. package/dist/okf/types/FHIRDatastore.md +3 -0
  347. package/dist/okf/types/FSxSnapshot.md +5 -5
  348. package/dist/okf/types/FSxVolume.md +9 -9
  349. package/dist/okf/types/FeaturedResultsSet.md +26 -0
  350. package/dist/okf/types/Feed.md +1 -0
  351. package/dist/okf/types/FieldLevelEncryptionConfig.md +25 -0
  352. package/dist/okf/types/FieldLevelEncryptionProfile.md +22 -0
  353. package/dist/okf/types/FileCache.md +45 -0
  354. package/dist/okf/types/Filter.md +27 -0
  355. package/dist/okf/types/Firewall.md +6 -0
  356. package/dist/okf/types/FlowMediaStream.md +28 -0
  357. package/dist/okf/types/FlowOutput.md +1 -0
  358. package/dist/okf/types/FpgaImage.md +38 -0
  359. package/dist/okf/types/Function.md +2 -2
  360. package/dist/okf/types/Gateway.md +41 -0
  361. package/dist/okf/types/GatewayClusterAssociations.md +23 -0
  362. package/dist/okf/types/GatewayRateLimit.md +26 -0
  363. package/dist/okf/types/GatewayRule.md +32 -0
  364. package/dist/okf/types/GlobalReplicationGroup.md +3 -0
  365. package/dist/okf/types/GlobalResolver.md +1 -1
  366. package/dist/okf/types/GlobalTable.md +1 -0
  367. package/dist/okf/types/GlueConnection.md +5 -4
  368. package/dist/okf/types/GlueSecurityConfiguration.md +1 -6
  369. package/dist/okf/types/GlueSession.md +38 -0
  370. package/dist/okf/types/GlueTable.md +5 -10
  371. package/dist/okf/types/GlueWorkflow.md +5 -10
  372. package/dist/okf/types/Group.md +27 -0
  373. package/dist/okf/types/Harness.md +1 -0
  374. package/dist/okf/types/HostKey.md +33 -0
  375. package/dist/okf/types/HostedZone.md +1 -0
  376. package/dist/okf/types/HttpApi.md +2 -0
  377. package/dist/okf/types/HttpNamespace.md +5 -5
  378. package/dist/okf/types/HubV2.md +1 -0
  379. package/dist/okf/types/HumanTaskUi.md +22 -0
  380. package/dist/okf/types/IPv4Pool.md +28 -0
  381. package/dist/okf/types/ImageBuilder.md +1 -0
  382. package/dist/okf/types/ImageBuilderImage.md +1 -1
  383. package/dist/okf/types/ImagePipeline.md +1 -1
  384. package/dist/okf/types/InferenceComponent.md +5 -1
  385. package/dist/okf/types/InfluxDBBackup.md +65 -0
  386. package/dist/okf/types/InfluxDBCluster.md +3 -0
  387. package/dist/okf/types/InfrastructureConfiguration.md +2 -0
  388. package/dist/okf/types/IngestionDestination.md +28 -0
  389. package/dist/okf/types/InputSecurityGroup.md +6 -4
  390. package/dist/okf/types/InspectorV2Connector.md +38 -0
  391. package/dist/okf/types/InstanceEventWindow.md +25 -0
  392. package/dist/okf/types/InstanceFleetConfig.md +10 -10
  393. package/dist/okf/types/InstanceGroupConfig.md +3 -3
  394. package/dist/okf/types/InstrumentationConfig.md +31 -0
  395. package/dist/okf/types/IntegrationAssociation.md +3 -0
  396. package/dist/okf/types/IoTSiteWiseApplication.md +34 -0
  397. package/dist/okf/types/IoTSiteWiseDataset.md +5 -2
  398. package/dist/okf/types/IoTSiteWiseTask.md +24 -0
  399. package/dist/okf/types/IpamExternalResourceVerificationToken.md +35 -0
  400. package/dist/okf/types/IpamInternetRegistryAssociation.md +32 -0
  401. package/dist/okf/types/Job.md +35 -0
  402. package/dist/okf/types/JobTemplate.md +26 -0
  403. package/dist/okf/types/KinesisChannel.md +31 -0
  404. package/dist/okf/types/KinesisStream.md +1 -0
  405. package/dist/okf/types/LambdaResourcePolicy.md +14 -0
  406. package/dist/okf/types/Lexicon.md +34 -0
  407. package/dist/okf/types/LicenseAssetGroup.md +23 -0
  408. package/dist/okf/types/LicenseConfiguration.md +33 -0
  409. package/dist/okf/types/LicenseServerEndpoint.md +32 -0
  410. package/dist/okf/types/LightsailKeyPair.md +29 -0
  411. package/dist/okf/types/LimitsProfile.md +27 -0
  412. package/dist/okf/types/LocationAzureBlob.md +2 -1
  413. package/dist/okf/types/LocationObjectStorage.md +1 -0
  414. package/dist/okf/types/LogAlarm.md +2 -0
  415. package/dist/okf/types/MGNConnector.md +23 -0
  416. package/dist/okf/types/MGNLaunchConfigurationTemplate.md +37 -0
  417. package/dist/okf/types/MLTransform.md +15 -15
  418. package/dist/okf/types/MWAAServerlessWorkflow.md +3 -0
  419. package/dist/okf/types/ManagedNotificationAccountContactAssociation.md +1 -0
  420. package/dist/okf/types/ManagedNotificationAdditionalChannelAssociation.md +1 -0
  421. package/dist/okf/types/MediaConvertJobTemplate.md +11 -13
  422. package/dist/okf/types/MediaConvertQueue.md +8 -10
  423. package/dist/okf/types/MediaInsightsPipelineConfiguration.md +28 -0
  424. package/dist/okf/types/MediaLiveInput.md +41 -18
  425. package/dist/okf/types/MediaPackageV2Channel.md +3 -0
  426. package/dist/okf/types/MediaPackageV2OriginEndpoint.md +1 -0
  427. package/dist/okf/types/MediaPipelineKinesisVideoStreamPool.md +28 -0
  428. package/dist/okf/types/MediaTailorFunction.md +27 -0
  429. package/dist/okf/types/MedicalVocabulary.md +21 -0
  430. package/dist/okf/types/Member.md +26 -0
  431. package/dist/okf/types/Memory.md +6 -0
  432. package/dist/okf/types/MemoryDBSnapshot.md +29 -0
  433. package/dist/okf/types/Metric.md +59 -0
  434. package/dist/okf/types/MetricAttribution.md +23 -0
  435. package/dist/okf/types/MicrosoftAD.md +11 -11
  436. package/dist/okf/types/MigrationProject.md +8 -1
  437. package/dist/okf/types/Monitor.md +26 -0
  438. package/dist/okf/types/NFSFileShare.md +44 -0
  439. package/dist/okf/types/NeptuneGraphGraph.md +1 -0
  440. package/dist/okf/types/NetworkConnector.md +4 -0
  441. package/dist/okf/types/NetworkFlowMonitorScope.md +23 -0
  442. package/dist/okf/types/NetworkMigrationDefinition.md +31 -0
  443. package/dist/okf/types/NetworkSecurityManagerDeployment.md +31 -0
  444. package/dist/okf/types/NetworkSecurityManagerPolicy.md +32 -0
  445. package/dist/okf/types/NetworkSecurityManagerScope.md +29 -0
  446. package/dist/okf/types/NotebookInstance.md +18 -18
  447. package/dist/okf/types/NotebookInstanceLifecycleConfig.md +6 -5
  448. package/dist/okf/types/NotifyConfiguration.md +35 -0
  449. package/dist/okf/types/OTelEnrichment.md +2 -0
  450. package/dist/okf/types/OnlineEvaluationConfig.md +0 -1
  451. package/dist/okf/types/OrganizationConfigRule.md +7 -7
  452. package/dist/okf/types/Outpost.md +32 -0
  453. package/dist/okf/types/ParallelData.md +40 -0
  454. package/dist/okf/types/Partition.md +5 -5
  455. package/dist/okf/types/PaymentConnector.md +4 -1
  456. package/dist/okf/types/Pentest.md +1 -0
  457. package/dist/okf/types/PerfReports.md +28 -0
  458. package/dist/okf/types/PermissionAssociation.md +30 -0
  459. package/dist/okf/types/PersonalizeDataset.md +1 -0
  460. package/dist/okf/types/PersonalizeDatasetGroup.md +1 -0
  461. package/dist/okf/types/PersonalizeSchema.md +1 -0
  462. package/dist/okf/types/Pipeline.md +25 -0
  463. package/dist/okf/types/PlaybackConfiguration.md +1 -0
  464. package/dist/okf/types/PolicyAssociation.md +1 -1
  465. package/dist/okf/types/PolicyGrant.md +2 -2
  466. package/dist/okf/types/PolicyPrincipalAttachment.md +2 -7
  467. package/dist/okf/types/PortalProduct.md +24 -0
  468. package/dist/okf/types/PrefetchSchedule.md +25 -0
  469. package/dist/okf/types/PricingPlanManagerSubscription.md +31 -0
  470. package/dist/okf/types/PrincipalAssociation.md +27 -0
  471. package/dist/okf/types/PrivateDnsNamespace.md +8 -8
  472. package/dist/okf/types/PrivateVirtualInterface.md +1 -0
  473. package/dist/okf/types/ProcurementPortalPreference.md +45 -0
  474. package/dist/okf/types/Program.md +33 -0
  475. package/dist/okf/types/ProjectMembership.md +1 -1
  476. package/dist/okf/types/ProtocolsList.md +26 -0
  477. package/dist/okf/types/PublicDnsNamespace.md +7 -7
  478. package/dist/okf/types/PublicVirtualInterface.md +1 -0
  479. package/dist/okf/types/QEV2IdcApplication.md +25 -0
  480. package/dist/okf/types/QueryLoggingConfig.md +21 -0
  481. package/dist/okf/types/QuerySuggestionsBlockList.md +25 -0
  482. package/dist/okf/types/QuickSightAssignment.md +24 -0
  483. package/dist/okf/types/RAMResourceAssociation.md +27 -0
  484. package/dist/okf/types/RDSClusterSnapshot.md +54 -0
  485. package/dist/okf/types/RDSDBParameterGroup.md +5 -0
  486. package/dist/okf/types/RDSDeployment.md +41 -0
  487. package/dist/okf/types/RcsAgent.md +38 -0
  488. package/dist/okf/types/ReceiptRule.md +5 -5
  489. package/dist/okf/types/ReceiptRuleSet.md +1 -6
  490. package/dist/okf/types/RecommenderFilter.md +27 -0
  491. package/dist/okf/types/RecommenderSchema.md +25 -0
  492. package/dist/okf/types/RecordSet.md +16 -22
  493. package/dist/okf/types/RecoveryPlan.md +28 -0
  494. package/dist/okf/types/RedshiftIdcApplication.md +31 -0
  495. package/dist/okf/types/RedshiftSnapshot.md +59 -0
  496. package/dist/okf/types/RegistrationAttachment.md +28 -0
  497. package/dist/okf/types/Registry.md +41 -0
  498. package/dist/okf/types/RegistryRecord.md +38 -0
  499. package/dist/okf/types/RelatedItem.md +24 -0
  500. package/dist/okf/types/ReplicationConfigurationTemplate.md +35 -0
  501. package/dist/okf/types/ReplicationSubnetGroup.md +4 -9
  502. package/dist/okf/types/ReplicationTask.md +14 -14
  503. package/dist/okf/types/ReportGenerator.md +29 -0
  504. package/dist/okf/types/ReportGroup.md +1 -3
  505. package/dist/okf/types/ResilienceHubV2Policy.md +1 -0
  506. package/dist/okf/types/ResilienceHubV2Service.md +1 -0
  507. package/dist/okf/types/ResourceConfiguration.md +1 -1
  508. package/dist/okf/types/ResourceMetricsConfiguration.md +21 -0
  509. package/dist/okf/types/RestApi.md +1 -0
  510. package/dist/okf/types/RetrievalInstruction.md +32 -0
  511. package/dist/okf/types/RouterOutput.md +1 -0
  512. package/dist/okf/types/Rule.md +31 -0
  513. package/dist/okf/types/RunCache.md +29 -0
  514. package/dist/okf/types/Runtime.md +2 -1
  515. package/dist/okf/types/SCNInstance.md +33 -0
  516. package/dist/okf/types/SDBDomain.md +2 -2
  517. package/dist/okf/types/SMBFileShare.md +49 -0
  518. package/dist/okf/types/SageMakerArtifact.md +27 -0
  519. package/dist/okf/types/SageMakerEndpoint.md +0 -1
  520. package/dist/okf/types/ScalableTarget.md +1 -0
  521. package/dist/okf/types/ScalingPlan.md +6 -6
  522. package/dist/okf/types/ScheduledReport.md +31 -0
  523. package/dist/okf/types/SecondaryNetwork.md +26 -0
  524. package/dist/okf/types/SecurityAgentArtifact.md +25 -0
  525. package/dist/okf/types/SecurityAgentIntegration.md +31 -0
  526. package/dist/okf/types/Server.md +1 -0
  527. package/dist/okf/types/ServerlessCache.md +2 -0
  528. package/dist/okf/types/ServerlessCacheSnapshot.md +31 -0
  529. package/dist/okf/types/ServerlessRepoApplication.md +32 -0
  530. package/dist/okf/types/ServiceDiscoveryInstance.md +3 -7
  531. package/dist/okf/types/SipMediaApplication.md +27 -0
  532. package/dist/okf/types/SiteToSiteVpnAttachment.md +2 -0
  533. package/dist/okf/types/SnapshotCopyGrant.md +20 -0
  534. package/dist/okf/types/Solution.md +1 -0
  535. package/dist/okf/types/SourceAssociation.md +25 -0
  536. package/dist/okf/types/SourceCredential.md +6 -6
  537. package/dist/okf/types/SourceNetwork.md +23 -0
  538. package/dist/okf/types/StackFleetAssociation.md +2 -7
  539. package/dist/okf/types/StorageTierPolicy.md +20 -0
  540. package/dist/okf/types/StorageVirtualMachine.md +9 -9
  541. package/dist/okf/types/Stream.md +28 -0
  542. package/dist/okf/types/SubnetCidrReservation.md +26 -0
  543. package/dist/okf/types/SubscriptionProvider.md +26 -0
  544. package/dist/okf/types/SupportPermit.md +29 -0
  545. package/dist/okf/types/Table.md +2 -1
  546. package/dist/okf/types/TableOptimizer.md +5 -10
  547. package/dist/okf/types/Tape.md +31 -0
  548. package/dist/okf/types/Template.md +36 -0
  549. package/dist/okf/types/Tenant.md +2 -0
  550. package/dist/okf/types/Terminology.md +39 -0
  551. package/dist/okf/types/Thesaurus.md +25 -0
  552. package/dist/okf/types/ThingPrincipalAttachment.md +3 -8
  553. package/dist/okf/types/Topic.md +1 -0
  554. package/dist/okf/types/TopicRuleDestination.md +1 -0
  555. package/dist/okf/types/TrafficPolicy.md +26 -0
  556. package/dist/okf/types/TrafficPolicyInstance.md +28 -0
  557. package/dist/okf/types/TranscribeVocabulary.md +27 -0
  558. package/dist/okf/types/TransitGatewayRouteTableAttachment.md +2 -0
  559. package/dist/okf/types/TransitVirtualInterface.md +1 -0
  560. package/dist/okf/types/Tunnel.md +25 -0
  561. package/dist/okf/types/UsageLimit.md +26 -0
  562. package/dist/okf/types/UseCase.md +23 -0
  563. package/dist/okf/types/User.md +47 -0
  564. package/dist/okf/types/VPCEndpoint.md +1 -1
  565. package/dist/okf/types/VPCEndpointService.md +6 -0
  566. package/dist/okf/types/VPCPeeringConnection.md +2 -2
  567. package/dist/okf/types/VPNConcentrator.md +1 -1
  568. package/dist/okf/types/VPNConnection.md +1 -1
  569. package/dist/okf/types/VerifiedDestinationNumber.md +25 -0
  570. package/dist/okf/types/View.md +27 -0
  571. package/dist/okf/types/VoiceConnector.md +30 -0
  572. package/dist/okf/types/Volume.md +44 -0
  573. package/dist/okf/types/Vpc.md +1 -1
  574. package/dist/okf/types/VpcAttachment.md +2 -0
  575. package/dist/okf/types/WebFunction.md +27 -0
  576. package/dist/okf/types/WebFunctionEndpoint.md +44 -0
  577. package/dist/okf/types/WebFunctionRevision.md +32 -0
  578. package/dist/okf/types/WickrNetwork.md +27 -0
  579. package/dist/okf/types/Worker.md +29 -0
  580. package/dist/okf/types/Workforce.md +26 -0
  581. package/dist/okf/types/Workload.md +35 -0
  582. package/dist/okf/types/WorkloadEstimate.md +35 -0
  583. package/dist/okf/types/Workspace.md +28 -0
  584. package/dist/okf/types/Workteam.md +8 -8
  585. package/dist/op/activities/aws-apply.js +214 -0
  586. package/dist/op/activities/floci.js +97 -0
  587. package/dist/op/activities/index.js +32 -0
  588. package/dist/op/builders.js +50 -0
  589. package/dist/ownership.js +52 -0
  590. package/dist/package-cli.js +25 -0
  591. package/dist/parameter.js +19 -0
  592. package/dist/plugin.d.ts.map +1 -1
  593. package/dist/plugin.js +1012 -0
  594. package/dist/properties.js +166 -0
  595. package/dist/pseudo.js +25 -0
  596. package/dist/receipt-store.d.ts.map +1 -1
  597. package/dist/receipt-store.js +233 -0
  598. package/dist/reference-catalog.js +106 -0
  599. package/dist/rules/ext001.ts +3 -3
  600. package/dist/rules/waw016.ts +2 -2
  601. package/dist/serializer.js +529 -0
  602. package/dist/spec/fetch.js +193 -0
  603. package/dist/spec/parse.js +259 -0
  604. package/dist/spec/pin.js +185 -0
  605. package/dist/spec/pinned-types.json +203 -0
  606. package/dist/stack-errors.js +14 -0
  607. package/dist/taggable.d.ts.map +1 -1
  608. package/dist/taggable.js +33 -0
  609. package/dist/teardown.js +199 -0
  610. package/dist/template-sections.js +53 -0
  611. package/dist/template-transform.js +50 -0
  612. package/dist/types/index.d.ts +18847 -1124
  613. package/dist/validate-cli.js +16 -0
  614. package/dist/validate.js +33 -0
  615. package/package.json +9 -9
  616. package/src/agentcore/trace-fetch.ts +2 -1
  617. package/src/api/credential-chain.ts +119 -9
  618. package/src/api/credential-isolation.test.ts +72 -0
  619. package/src/api/read-client-chain.test.ts +159 -0
  620. package/src/api/read-client.ts +42 -6
  621. package/src/api/sigv4.ts +4 -4
  622. package/src/caller-identity.ts +3 -5
  623. package/src/codegen/any-budget.test.ts +12 -2
  624. package/src/codegen/generate.ts +9 -0
  625. package/src/codegen/package.ts +2 -2
  626. package/src/codegen/patches.test.ts +95 -0
  627. package/src/codegen/patches.ts +53 -9
  628. package/src/codegen/property-overlay.json +1 -16
  629. package/src/components/apply.ts +218 -6
  630. package/src/components/cfn-plan-floci.e2e.test.ts +76 -0
  631. package/src/components/cfn-plan.test.ts +225 -16
  632. package/src/components/cloud-executor.ts +73 -25
  633. package/src/deep-observe.ts +2 -1
  634. package/src/disruption.ts +2 -1
  635. package/src/generated/index.d.ts +18847 -1124
  636. package/src/generated/index.ts +1376 -161
  637. package/src/generated/lexicon-aws.json +17359 -784
  638. package/src/health.test.ts +136 -0
  639. package/src/health.ts +281 -0
  640. package/src/identity-observe.ts +2 -1
  641. package/src/lint/post-synth/ext001.ts +3 -3
  642. package/src/lint/post-synth/waw016.ts +2 -2
  643. package/src/lsp/completions.ts +2 -1
  644. package/src/lsp/hover.ts +2 -1
  645. package/src/plugin.ts +10 -1
  646. package/src/receipt-store.ts +2 -1
  647. package/src/spec/pin.ts +3 -3
  648. package/src/spec/pinned-types.json +203 -0
  649. package/src/taggable.ts +2 -2
@@ -0,0 +1,576 @@
1
+ /**
2
+ * Injectable cloud I/O boundary for the AWS-leaf capability implementations
3
+ * (#557, epic #551), living in the aws lexicon so a project's cloud verbs are
4
+ * contributed by its active lexicon rather than baked into core (see
5
+ * docs/components/cloud-boundary). Every AWS-leaf capability here goes through
6
+ * a `CloudExecutor` instead of shelling out directly, so:
7
+ *
8
+ * - production code gets a real executor that shells out to the `aws` and
9
+ * `docker` CLIs (this codebase shells out to native CLIs rather than
10
+ * depending on AWS SDK v3 packages);
11
+ * - tests get a `MockCloudExecutor` (./__tests__/mock-cloud-executor.ts) that
12
+ * records calls and returns canned results — no live AWS, no live docker.
13
+ *
14
+ * The `docker` client is genuinely agnostic and shared: its type + real
15
+ * implementation (`realDocker`) come from core; only the AWS-specific clients
16
+ * (ECR, CloudFormation, ECS, CodeDeploy, Lambda, EMR, SSM host, S3, CloudFront,
17
+ * snapshot) are defined here.
18
+ */
19
+ import { exec } from "node:child_process";
20
+ import { promisify } from "node:util";
21
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
22
+ import { tmpdir } from "node:os";
23
+ import { join } from "node:path";
24
+ import { realDocker } from "@intentius/chant/components/verbs/cloud-executor";
25
+ import { q } from "@intentius/chant/components/verbs/process-runner";
26
+ import { ownershipStackTagsForBody } from "../ownership.js";
27
+ const execFileAsync = promisify(exec);
28
+ // ── Real executor — shells out to `docker`/`aws`; used outside tests ────────
29
+ /**
30
+ * Inject `--endpoint-url` into an `aws …` command when an endpoint is set, so the
31
+ * same component can target a local AWS emulator (Floci, LocalStack, …) or any
32
+ * custom endpoint without a wrapper. We add the flag ourselves rather than rely
33
+ * on the CLI reading `AWS_ENDPOINT_URL` — older `aws` v2 releases (<2.13) don't.
34
+ * Non-`aws` commands (docker, …) pass through untouched.
35
+ */
36
+ export function applyAwsEndpoint(command, endpoint) {
37
+ if (!endpoint || !/^aws\s/.test(command))
38
+ return command;
39
+ return command.replace(/^aws\s/, `aws --endpoint-url ${q(endpoint)} `);
40
+ }
41
+ /**
42
+ * argv-form of {@link applyAwsEndpoint}: insert `--endpoint-url <endpoint>` right
43
+ * after `aws` (argv[0]) when an endpoint is set, so a *spawned* `aws …` call (live
44
+ * acquisition, `graph --live`) targets a local emulator instead of real AWS.
45
+ * Non-`aws` argvs pass through untouched. Same reason as the string form — older
46
+ * `aws` v2 (<2.13) ignores `AWS_ENDPOINT_URL`.
47
+ */
48
+ export function applyAwsEndpointArgv(argv, endpoint) {
49
+ if (!endpoint || argv[0] !== "aws")
50
+ return argv;
51
+ return [argv[0], "--endpoint-url", endpoint, ...argv.slice(1)];
52
+ }
53
+ function run(command) {
54
+ return execFileAsync(applyAwsEndpoint(command, process.env.AWS_ENDPOINT_URL), {
55
+ maxBuffer: 64 * 1024 * 1024,
56
+ });
57
+ }
58
+ const realEcr = {
59
+ async login(registry) {
60
+ await run(`aws ecr get-login-password | docker login --username AWS --password-stdin ${q(registry)}`);
61
+ },
62
+ };
63
+ /**
64
+ * CREATE for a stack that doesn't exist (or is stuck in REVIEW_IN_PROGRESS from
65
+ * a prior unexecuted CREATE), else UPDATE; and whether a stack existed at all.
66
+ */
67
+ async function cfnChangeSetType(stackName) {
68
+ try {
69
+ const { stdout } = await run(`aws cloudformation describe-stacks --stack-name ${q(stackName)}`);
70
+ const status = JSON.parse(stdout).Stacks?.[0]?.StackStatus;
71
+ return { type: status === "REVIEW_IN_PROGRESS" ? "CREATE" : "UPDATE", existed: true };
72
+ }
73
+ catch {
74
+ return { type: "CREATE", existed: false }; // describe-stacks errors when the stack doesn't exist
75
+ }
76
+ }
77
+ /**
78
+ * The `--capabilities` a deploy needs for a template. `CAPABILITY_NAMED_IAM` is
79
+ * always required (chant emits named IAM roles); `CAPABILITY_AUTO_EXPAND` is added
80
+ * whenever the template declares a top-level `Transform` macro (e.g.
81
+ * `AWS::SecretsManager-2020-07-23` for a HostedRotationLambda rotation, or SAM) —
82
+ * the macro expands into nested stacks/resources during change-set creation, and
83
+ * CloudFormation refuses without the acknowledgement.
84
+ */
85
+ export function awsDeployCapabilities(template) {
86
+ return awsDeployCapabilityList(template).join(" ");
87
+ }
88
+ /** {@link awsDeployCapabilities} as a list, for the CFN API's `Capabilities.member.N` params. */
89
+ export function awsDeployCapabilityList(template) {
90
+ return template.Transform !== undefined
91
+ ? ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
92
+ : ["CAPABILITY_NAMED_IAM"];
93
+ }
94
+ /**
95
+ * {@link awsDeployCapabilityList} for a raw template body. A body that isn't
96
+ * JSON gets the default list; the deploy itself reports the real problem.
97
+ */
98
+ export function awsDeployCapabilitiesForBody(body) {
99
+ try {
100
+ return awsDeployCapabilityList(JSON.parse(body));
101
+ }
102
+ catch {
103
+ return ["CAPABILITY_NAMED_IAM"];
104
+ }
105
+ }
106
+ /** Whether a template body declares an `AWS::CloudFormation::Stack` resource. A body that isn't JSON declares none here. */
107
+ export function templateHasNestedStacks(body) {
108
+ try {
109
+ const resources = JSON.parse(body).Resources ?? {};
110
+ return Object.values(resources).some((r) => r?.Type === "AWS::CloudFormation::Stack");
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ /**
117
+ * A described change set's changes as {@link CfnChange}s, and the changes of
118
+ * every nested change set it names, each marked with the nested stacks it
119
+ * sits in (#3997). `describeNested` describes a nested change set by its ARN.
120
+ */
121
+ export async function readCfnChanges(described, describeNested, nestedStack = []) {
122
+ const out = [];
123
+ for (const c of described.Changes ?? []) {
124
+ const rc = c.ResourceChange;
125
+ out.push({
126
+ action: rc.Action,
127
+ logicalResourceId: rc.LogicalResourceId,
128
+ resourceType: rc.ResourceType,
129
+ replacement: rc.Replacement === "True",
130
+ ...(rc.Replacement === "True" || rc.Replacement === "False" || rc.Replacement === "Conditional" ? { replacementMode: rc.Replacement } : {}),
131
+ details: rc.Details?.map((d) => d.Target?.Name).filter((x) => !!x),
132
+ ...(nestedStack.length > 0 ? { nestedStack } : {}),
133
+ });
134
+ if (rc.ResourceType === "AWS::CloudFormation::Stack" && rc.ChangeSetId) {
135
+ out.push(...(await readCfnChanges(await describeNested(rc.ChangeSetId), describeNested, [...nestedStack, rc.LogicalResourceId])));
136
+ }
137
+ }
138
+ return out;
139
+ }
140
+ const realCloudFormation = {
141
+ async createChangeSet(args) {
142
+ const changeSetName = `cs-${Date.now()}`;
143
+ const params = Object.entries(args.parameters ?? {})
144
+ .map(([k, v]) => `ParameterKey=${k},ParameterValue=${v}`)
145
+ .join(" ");
146
+ const paramFlag = params ? ` --parameters ${params}` : "";
147
+ // A change set defaults to type UPDATE, which fails on a stack that doesn't
148
+ // exist yet ("Stack ... does not exist"). Pick CREATE for a new stack, and
149
+ // for one still in REVIEW_IN_PROGRESS (a prior CREATE change set never
150
+ // executed), mirroring what `aws cloudformation deploy` does under the hood.
151
+ const { type: changeSetType, existed } = await cfnChangeSetType(args.stackName);
152
+ let body = "";
153
+ try {
154
+ body = readFileSync(args.templatePath, "utf8");
155
+ }
156
+ catch { /* unreadable template — create-change-set reports it */ }
157
+ const capabilities = awsDeployCapabilitiesForBody(body).join(" ");
158
+ // The template's ownership marker becomes the STACK's own tags (#1222) —
159
+ // the identity stack-level teardown verifies before a DeleteStack. Same
160
+ // source as the applier's `Tags.member.N`: `Metadata["chant:ownership"]`.
161
+ const stackTags = Object.entries(ownershipStackTagsForBody(body))
162
+ .sort(([a], [b]) => a.localeCompare(b))
163
+ .map(([k, v]) => q(`Key=${k},Value=${v}`))
164
+ .join(" ");
165
+ const tagsFlag = stackTags ? ` --tags ${stackTags}` : "";
166
+ // A template with nested stacks gets their change sets too, so a plan
167
+ // shows what changes inside each child, not only that the child changes
168
+ // (#3997). Executing the root change set executes the nested ones.
169
+ const nestedFlag = templateHasNestedStacks(body) ? " --include-nested-stacks" : "";
170
+ await run(`aws cloudformation create-change-set --stack-name ${q(args.stackName)} --change-set-name ${q(changeSetName)} ` +
171
+ `--change-set-type ${changeSetType} ` +
172
+ `--template-body file://${args.templatePath} --capabilities ${capabilities}${paramFlag}${tagsFlag}${nestedFlag}`);
173
+ await run(`aws cloudformation wait change-set-create-complete --stack-name ${q(args.stackName)} --change-set-name ${q(changeSetName)}`).catch(() => undefined); // "no changes" also lands here; describe below reports the real status.
174
+ const { stdout } = await run(`aws cloudformation describe-change-set --stack-name ${q(args.stackName)} --change-set-name ${q(changeSetName)}`);
175
+ const described = JSON.parse(stdout);
176
+ const describeNested = async (changeSetId) => JSON.parse((await run(`aws cloudformation describe-change-set --change-set-name ${q(changeSetId)}`)).stdout);
177
+ return {
178
+ changeSetName,
179
+ stackName: args.stackName,
180
+ status: described.Status,
181
+ statusReason: described.StatusReason ?? undefined,
182
+ isCreate: described.Status === "CREATE_COMPLETE" && !described.Changes?.length,
183
+ changeSetType,
184
+ stackCreated: !existed,
185
+ changes: await readCfnChanges(described, describeNested),
186
+ };
187
+ },
188
+ async executeChangeSet(args) {
189
+ await run(`aws cloudformation execute-change-set --stack-name ${q(args.stackName)} --change-set-name ${q(args.changeSetName)}`);
190
+ },
191
+ async deleteChangeSet(args) {
192
+ await run(`aws cloudformation delete-change-set --stack-name ${q(args.stackName)} --change-set-name ${q(args.changeSetName)}`);
193
+ },
194
+ async describeStack(stackName) {
195
+ const { stdout } = await run(`aws cloudformation describe-stacks --stack-name ${q(stackName)}`);
196
+ const described = JSON.parse(stdout);
197
+ const stack = described.Stacks[0];
198
+ const outputs = {};
199
+ for (const o of stack?.Outputs ?? [])
200
+ outputs[o.OutputKey] = o.OutputValue;
201
+ return { stackStatus: stack?.StackStatus ?? "UNKNOWN", outputs };
202
+ },
203
+ async waitForStack(stackName, opts) {
204
+ const intervalMs = opts?.intervalMs ?? 10000;
205
+ const deadline = opts?.timeoutMs ? Date.now() + opts.timeoutMs : undefined;
206
+ while (true) {
207
+ const status = await realCloudFormation.describeStack(stackName);
208
+ if (!status.stackStatus.endsWith("_IN_PROGRESS"))
209
+ return status;
210
+ if (deadline && Date.now() > deadline)
211
+ throw new Error(`waitForStack "${stackName}" timed out`);
212
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
213
+ }
214
+ },
215
+ async rollbackStack(stackName) {
216
+ await run(`aws cloudformation rollback-stack --stack-name ${q(stackName)}`);
217
+ },
218
+ async deleteStackShell(stackName) {
219
+ let status;
220
+ try {
221
+ status = (await realCloudFormation.describeStack(stackName)).stackStatus;
222
+ }
223
+ catch {
224
+ return false; // gone already
225
+ }
226
+ if (status !== "REVIEW_IN_PROGRESS")
227
+ return false;
228
+ await run(`aws cloudformation delete-stack --stack-name ${q(stackName)}`);
229
+ return true;
230
+ },
231
+ };
232
+ /** Deployment id from an ECS `update-service` response. Tolerant of Floci, whose
233
+ * `service` omits `deployments` entirely (real AWS always includes it) — guards
234
+ * the index, not just `.id` (#937). Exported for testing. */
235
+ export function ecsDeploymentId(described) {
236
+ return described.service.deployments?.[0]?.id ?? "";
237
+ }
238
+ /** Whether an ECS service is steady (running == desired, ≤1 active deployment).
239
+ * Tolerant of Floci's missing `deployments` field. Exported for testing. */
240
+ export function ecsServiceStable(svc) {
241
+ const running = svc?.runningCount ?? 0;
242
+ const desired = svc?.desiredCount ?? 0;
243
+ return running === desired && (svc?.deployments?.length ?? 0) <= 1;
244
+ }
245
+ const realEcs = {
246
+ async updateService(args) {
247
+ const parts = [`aws ecs update-service`, `--cluster ${q(args.cluster)}`, `--service ${q(args.service)}`];
248
+ if (args.taskDefinition)
249
+ parts.push(`--task-definition ${q(args.taskDefinition)}`);
250
+ if (args.desiredCount !== undefined)
251
+ parts.push(`--desired-count ${args.desiredCount}`);
252
+ if (args.forceNewDeployment)
253
+ parts.push(`--force-new-deployment`);
254
+ const { stdout } = await run(parts.join(" "));
255
+ const described = JSON.parse(stdout);
256
+ return { deploymentId: ecsDeploymentId(described) };
257
+ },
258
+ async describeService(cluster, service) {
259
+ const { stdout } = await run(`aws ecs describe-services --cluster ${q(cluster)} --services ${q(service)}`);
260
+ const described = JSON.parse(stdout);
261
+ const svc = described.services?.[0];
262
+ return {
263
+ runningCount: svc?.runningCount ?? 0,
264
+ desiredCount: svc?.desiredCount ?? 0,
265
+ stable: ecsServiceStable(svc),
266
+ ...(svc?.taskDefinition ? { taskDefinition: svc.taskDefinition } : {}),
267
+ };
268
+ },
269
+ async rollbackService(args) {
270
+ // The executor records no previous task definition itself, so a rollback
271
+ // without one would leave the service as it is and still report success (#2605).
272
+ // Callers read it with describeService before they update (#2609).
273
+ if (!args.taskDefinition) {
274
+ throw new Error(`ecs rollback of service "${args.service}" on "${args.cluster}" needs the taskDefinition to roll back to`);
275
+ }
276
+ await realEcs.updateService(args);
277
+ },
278
+ async runTask(args) {
279
+ const parts = [
280
+ `aws ecs run-task`,
281
+ `--cluster ${q(args.cluster)}`,
282
+ `--task-definition ${q(args.taskDefinition)}`,
283
+ `--launch-type ${args.launchType ?? "FARGATE"}`,
284
+ ];
285
+ if (args.subnets?.length) {
286
+ const net = {
287
+ awsvpcConfiguration: {
288
+ subnets: args.subnets,
289
+ securityGroups: args.securityGroups ?? [],
290
+ assignPublicIp: args.assignPublicIp ? "ENABLED" : "DISABLED",
291
+ },
292
+ };
293
+ parts.push(`--network-configuration ${q(JSON.stringify(net))}`);
294
+ }
295
+ if (args.command?.length) {
296
+ const overrides = { containerOverrides: [{ name: args.container ?? "", command: args.command }] };
297
+ parts.push(`--overrides ${q(JSON.stringify(overrides))}`);
298
+ }
299
+ const { stdout } = await run(parts.join(" "));
300
+ const described = JSON.parse(stdout);
301
+ const taskArn = described.tasks[0]?.taskArn;
302
+ if (!taskArn)
303
+ throw new Error(`ecs run-task on "${args.cluster}" started no task: ${JSON.stringify(described.failures ?? [])}`);
304
+ return { taskArn };
305
+ },
306
+ async waitForTask(cluster, taskArn) {
307
+ await run(`aws ecs wait tasks-stopped --cluster ${q(cluster)} --tasks ${q(taskArn)}`);
308
+ const { stdout } = await run(`aws ecs describe-tasks --cluster ${q(cluster)} --tasks ${q(taskArn)}`);
309
+ const described = JSON.parse(stdout);
310
+ const task = described.tasks[0];
311
+ return {
312
+ lastStatus: task?.lastStatus ?? "UNKNOWN",
313
+ exitCode: task?.containers?.[0]?.exitCode,
314
+ ...(task?.stoppedReason ? { stoppedReason: task.stoppedReason } : {}),
315
+ };
316
+ },
317
+ };
318
+ const realCodeDeploy = {
319
+ async createDeployment(args) {
320
+ const revisionFlag = args.revision.type === "s3"
321
+ ? `--s3-location bundleType=zip,bucket=${q(args.revision.uri.replace("s3://", "").split("/")[0])},key=${q(args.revision.uri.replace("s3://", "").split("/").slice(1).join("/"))}`
322
+ : `--github-location repository=${q(args.revision.repository)},commitId=${q(args.revision.commitId)}`;
323
+ const { stdout } = await run(`aws deploy create-deployment --application-name ${q(args.application)} ` +
324
+ `--deployment-group-name ${q(args.deploymentGroup)} --revision revisionType=${args.revision.type === "s3" ? "S3" : "GitHub"},${revisionFlag}`);
325
+ const described = JSON.parse(stdout);
326
+ return { deploymentId: described.deploymentId };
327
+ },
328
+ async waitForDeployment(deploymentId, opts) {
329
+ const intervalMs = opts?.intervalMs ?? 10000;
330
+ const deadline = opts?.timeoutMs ? Date.now() + opts.timeoutMs : undefined;
331
+ while (true) {
332
+ const { stdout } = await run(`aws deploy get-deployment --deployment-id ${q(deploymentId)}`);
333
+ const described = JSON.parse(stdout);
334
+ const status = described.deploymentInfo.status;
335
+ if (["Succeeded", "Failed", "Stopped"].includes(status))
336
+ return { status, terminal: true };
337
+ if (deadline && Date.now() > deadline)
338
+ throw new Error(`waitForDeployment "${deploymentId}" timed out`);
339
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
340
+ }
341
+ },
342
+ async stopAndRollback(deploymentId) {
343
+ // CodeDeploy's native auto-rollback-on-failure already reverts to the last
344
+ // known-good revision when a deployment fails; explicitly stopping with
345
+ // rollback covers the case where the caller is compensating a deployment
346
+ // that is still in flight.
347
+ await run(`aws deploy stop-deployment --deployment-id ${q(deploymentId)} --auto-rollback-enabled`);
348
+ },
349
+ };
350
+ const realHost = {
351
+ async copyFile(args) {
352
+ // SSM Run Command, per the same transport `copy-to-host` documents: stage
353
+ // the tarball via an S3 hop (`aws s3 cp` then a remote `aws s3 cp` inside
354
+ // the command document) is the common pattern for files too large for an
355
+ // inline SSM document; kept to a single conceptual step here since the
356
+ // executor boundary is what tests substitute, not this shell recipe.
357
+ await run(`aws ssm send-command --instance-ids ${q(args.host)} --document-name AWS-RunShellScript ` +
358
+ `--parameters ${q(JSON.stringify({ commands: [`aws s3 cp ${args.from} ${args.to}`] }))}`);
359
+ },
360
+ async dockerLoad(args) {
361
+ const { stdout } = await run(`aws ssm send-command --instance-ids ${q(args.host)} --document-name AWS-RunShellScript ` +
362
+ `--parameters ${q(JSON.stringify({ commands: [`docker load -i ${args.path}`] }))}`);
363
+ const match = stdout.match(/[Ll]oaded image(?: ID)?:\s*(\S+)/);
364
+ return { digest: match?.[1] ?? stdout.trim() };
365
+ },
366
+ async exec(args) {
367
+ const command = args.cwd ? `cd ${args.cwd} && ${args.command}` : args.command;
368
+ const { stdout: idOut } = await run(`aws ssm send-command --instance-ids ${q(args.host)} --document-name AWS-RunShellScript ` +
369
+ `--parameters ${q(JSON.stringify({ commands: [command] }))} --query 'Command.CommandId' --output text`);
370
+ const commandId = idOut.trim();
371
+ for (;;) {
372
+ await sleep(2000);
373
+ const { stdout } = await run(`aws ssm get-command-invocation --command-id ${q(commandId)} --instance-id ${q(args.host)} --output json`).catch(() => ({ stdout: "" }));
374
+ if (!stdout)
375
+ continue; // invocation not registered yet
376
+ const inv = JSON.parse(stdout);
377
+ if (["Success", "Failed", "Cancelled", "TimedOut"].includes(inv.Status)) {
378
+ if (inv.Status !== "Success") {
379
+ throw new Error(`remote-exec on ${args.host} ${inv.Status}: ${inv.StandardErrorContent?.trim() ?? ""}`);
380
+ }
381
+ return { stdout: inv.StandardOutputContent ?? "", exitCode: inv.ResponseCode ?? 0 };
382
+ }
383
+ }
384
+ },
385
+ };
386
+ const realLambda = {
387
+ async updateFunctionCode(args) {
388
+ const { stdout } = await run(`aws lambda update-function-code --function-name ${q(args.functionName)} --image-uri ${q(args.imageUri)}`);
389
+ const described = JSON.parse(stdout);
390
+ return { functionArn: described.FunctionArn };
391
+ },
392
+ async waitForUpdate(functionName) {
393
+ await run(`aws lambda wait function-updated-v2 --function-name ${q(functionName)}`);
394
+ const { stdout } = await run(`aws lambda get-function --function-name ${q(functionName)}`);
395
+ const described = JSON.parse(stdout);
396
+ return { status: described.Configuration.LastUpdateStatus };
397
+ },
398
+ async publishVersion(args) {
399
+ const { stdout } = await run(`aws lambda publish-version --function-name ${q(args.functionName)}`);
400
+ const described = JSON.parse(stdout);
401
+ return { version: described.Version, functionArn: described.FunctionArn };
402
+ },
403
+ async updateAlias(args) {
404
+ const { stdout } = await run(`aws lambda update-alias --function-name ${q(args.functionName)} --name ${q(args.alias)} --function-version ${q(args.version)}`);
405
+ const described = JSON.parse(stdout);
406
+ return { aliasArn: described.AliasArn };
407
+ },
408
+ async getAliasVersion(functionName, alias) {
409
+ try {
410
+ const { stdout } = await run(`aws lambda get-alias --function-name ${q(functionName)} --name ${q(alias)}`);
411
+ const described = JSON.parse(stdout);
412
+ return described.FunctionVersion;
413
+ }
414
+ catch {
415
+ return undefined; // alias does not exist yet (first deploy) — nothing to restore on rollback.
416
+ }
417
+ },
418
+ async invoke(args) {
419
+ // `aws lambda invoke` writes the response payload to a file arg and its
420
+ // metadata (StatusCode/FunctionError) to stdout, so use a throwaway temp
421
+ // dir for both the request payload (fileb:// — raw bytes, version-agnostic)
422
+ // and the response, and clean it up regardless of outcome.
423
+ const dir = mkdtempSync(join(tmpdir(), "chant-lambda-"));
424
+ const outFile = join(dir, "response.json");
425
+ try {
426
+ let payloadFlag = "";
427
+ if (args.payload !== undefined) {
428
+ const payloadFile = join(dir, "payload.json");
429
+ writeFileSync(payloadFile, args.payload);
430
+ payloadFlag = ` --payload fileb://${payloadFile}`;
431
+ }
432
+ const { stdout } = await run(`aws lambda invoke --function-name ${q(args.functionName)}${payloadFlag} ${q(outFile)}`);
433
+ const meta = JSON.parse(stdout);
434
+ return {
435
+ statusCode: meta.StatusCode,
436
+ payload: readFileSync(outFile, "utf8"),
437
+ ...(meta.FunctionError ? { functionError: meta.FunctionError } : {}),
438
+ };
439
+ }
440
+ finally {
441
+ rmSync(dir, { recursive: true, force: true });
442
+ }
443
+ },
444
+ };
445
+ const realEmr = {
446
+ async startJobRun(args) {
447
+ const parts = [
448
+ `aws emr-serverless start-job-run`,
449
+ `--application-id ${q(args.clusterOrApplicationId)}`,
450
+ `--execution-role-arn ${q(args.executionRoleArn ?? "")}`,
451
+ `--job-driver ${q(JSON.stringify({ sparkSubmit: { entryPoint: args.jar, entryPointArguments: args.args ?? [] } }))}`,
452
+ ];
453
+ const { stdout } = await run(parts.join(" "));
454
+ const described = JSON.parse(stdout);
455
+ return { runId: described.jobRunId };
456
+ },
457
+ async addStep(args) {
458
+ const step = {
459
+ Name: args.name,
460
+ ActionOnFailure: args.actionOnFailure ?? "CONTINUE",
461
+ HadoopJarStep: { Jar: args.jar, Args: args.args ?? [] },
462
+ };
463
+ const { stdout } = await run(`aws emr add-steps --cluster-id ${q(args.clusterId)} --steps ${q(JSON.stringify([step]))}`);
464
+ const described = JSON.parse(stdout);
465
+ const stepId = described.StepIds?.[0];
466
+ if (!stepId)
467
+ throw new Error(`emr add-steps on "${args.clusterId}" returned no step id`);
468
+ return { stepId };
469
+ },
470
+ async describeJobRun(runId) {
471
+ const { stdout } = await run(`aws emr-serverless get-job-run --job-run-id ${q(runId)}`);
472
+ const described = JSON.parse(stdout);
473
+ return { state: described.jobRun.state };
474
+ },
475
+ async waitForJobRun(runId, opts) {
476
+ const intervalMs = opts?.intervalMs ?? 10000;
477
+ const deadline = opts?.timeoutMs ? Date.now() + opts.timeoutMs : undefined;
478
+ const terminal = new Set(["COMPLETED", "FAILED", "CANCELLED"]);
479
+ while (true) {
480
+ const status = await realEmr.describeJobRun(runId);
481
+ if (terminal.has(status.state))
482
+ return status;
483
+ if (deadline && Date.now() > deadline)
484
+ throw new Error(`waitForJobRun "${runId}" timed out`);
485
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
486
+ }
487
+ },
488
+ async cancelJobRun(runId) {
489
+ await run(`aws emr-serverless cancel-job-run --job-run-id ${q(runId)}`);
490
+ },
491
+ };
492
+ const realS3 = {
493
+ async sync(args) {
494
+ const flags = args.delete ? " --delete" : "";
495
+ const { stdout } = await run(`aws s3 sync ${q(args.from)} ${q(args.to)}${flags} --no-progress`);
496
+ // `aws s3 sync` prints one `upload: …` / `delete: …` line per object touched.
497
+ const count = (re) => stdout.split("\n").filter((l) => re.test(l)).length;
498
+ return { uploaded: count(/^upload:/), deleted: count(/^delete:/) };
499
+ },
500
+ async cp(args) {
501
+ await run(`aws s3 cp ${q(args.from)} ${q(args.to)} --no-progress`);
502
+ },
503
+ };
504
+ const realCloudFront = {
505
+ async createInvalidation(args) {
506
+ const paths = args.paths.map(q).join(" ");
507
+ const { stdout } = await run(`aws cloudfront create-invalidation --distribution-id ${q(args.distributionId)} --paths ${paths}`);
508
+ const id = JSON.parse(stdout).Invalidation?.Id;
509
+ return { invalidationId: id ?? "" };
510
+ },
511
+ };
512
+ const realSnapshot = {
513
+ async create({ resource, resourceKind }) {
514
+ const id = `${resource}-${Date.now()}`;
515
+ switch (resourceKind) {
516
+ case "dynamodb-table": {
517
+ const { stdout } = await run(`aws dynamodb create-backup --table-name ${q(resource)} --backup-name ${q(id)} --query 'BackupDetails.BackupArn' --output text`);
518
+ return { snapshotId: stdout.trim() };
519
+ }
520
+ case "rds-instance": {
521
+ const { stdout } = await run(`aws rds create-db-snapshot --db-instance-identifier ${q(resource)} --db-snapshot-identifier ${q(id)} --query 'DBSnapshot.DBSnapshotArn' --output text`);
522
+ return { snapshotId: stdout.trim() };
523
+ }
524
+ case "ebs-volume": {
525
+ const { stdout } = await run(`aws ec2 create-snapshot --volume-id ${q(resource)} --description ${q(`chant snapshot-before ${id}`)} --query 'SnapshotId' --output text`);
526
+ return { snapshotId: stdout.trim() };
527
+ }
528
+ case "opensearch-domain":
529
+ // OpenSearch manual snapshots require a pre-registered S3 repository + a
530
+ // signed _snapshot REST call, not a one-shot CLI verb — out of scope here.
531
+ throw new Error(`snapshot-before: opensearch-domain needs a registered S3 snapshot repository; not yet supported (resource "${resource}")`);
532
+ }
533
+ },
534
+ async restore({ resource, snapshotId }) {
535
+ // Dispatch by the snapshot-id shape produced by `create` above.
536
+ if (snapshotId.includes(":dynamodb:") || snapshotId.includes("/backup/")) {
537
+ await run(`aws dynamodb restore-table-from-backup --target-table-name ${q(resource)} --backup-arn ${q(snapshotId)}`);
538
+ await run(`aws dynamodb wait table-exists --table-name ${q(resource)}`);
539
+ return;
540
+ }
541
+ if (snapshotId.includes(":rds:") || snapshotId.startsWith("rds:")) {
542
+ await run(`aws rds restore-db-instance-from-db-snapshot --db-instance-identifier ${q(resource)} --db-snapshot-identifier ${q(snapshotId)}`);
543
+ await run(`aws rds wait db-instance-available --db-instance-identifier ${q(resource)}`);
544
+ return;
545
+ }
546
+ throw new Error(`rollback-previous: cannot infer the restore mechanism from snapshot id "${snapshotId}" (expected a DynamoDB or RDS backup ARN)`);
547
+ },
548
+ };
549
+ /** Build a `CloudExecutor` that shells out to real `docker`/`aws` CLIs and probes real bolt ports. Never used in tests. */
550
+ export function realCloudExecutor() {
551
+ return {
552
+ docker: realDocker,
553
+ ecr: realEcr,
554
+ cloudformation: realCloudFormation,
555
+ ecs: realEcs,
556
+ codeDeploy: realCodeDeploy,
557
+ lambda: realLambda,
558
+ emr: realEmr,
559
+ host: realHost,
560
+ s3: realS3,
561
+ cloudfront: realCloudFront,
562
+ snapshot: realSnapshot,
563
+ };
564
+ }
565
+ /** Lazily-constructed process-wide default so importing a capability module never shells out at import time. */
566
+ let defaultExecutor;
567
+ /** The default `CloudExecutor` each capability factory falls back to when none is supplied. */
568
+ export function defaultCloudExecutor() {
569
+ if (!defaultExecutor)
570
+ defaultExecutor = realCloudExecutor();
571
+ return defaultExecutor;
572
+ }
573
+ /** Sleep for `ms`. Shared by every polling capability (`wait-*`) between attempts. */
574
+ export function sleep(ms) {
575
+ return new Promise((resolve) => setTimeout(resolve, ms));
576
+ }