@h-ai/deploy 0.1.0-alpha.64 → 0.1.0-alpha.66

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.
package/dist/index.d.ts CHANGED
@@ -2,6 +2,35 @@ import { z } from 'zod';
2
2
  import * as _h_ai_core from '@h-ai/core';
3
3
  import { HaiResult, HaiError } from '@h-ai/core';
4
4
 
5
+ /** 镜像制品清单,例如 `{ version: 2, appVersion: '1.2.3', buildId: '1.2.3-build1', images: [{ name: 'app', file: 'app-1.2.3.tar', imageRef: 'localhost/demo:1.2.3-build1', sha256: '...' }] }`。 */
6
+ declare const DeploymentArtifactSchema: z.ZodObject<{
7
+ version: z.ZodLiteral<2>;
8
+ appVersion: z.ZodString;
9
+ buildId: z.ZodString;
10
+ images: z.ZodArray<z.ZodObject<{
11
+ name: z.ZodEnum<{
12
+ app: "app";
13
+ web: "web";
14
+ }>;
15
+ file: z.ZodString;
16
+ imageRef: z.ZodString;
17
+ sha256: z.ZodString;
18
+ containerPort: z.ZodOptional<z.ZodNumber>;
19
+ }, z.core.$strip>>;
20
+ }, z.core.$strip>;
21
+ /** 构建器与部署器共享的镜像交付结构;参见 DeploymentArtifactSchema 示例。 */
22
+ type DeploymentArtifact = z.infer<typeof DeploymentArtifactSchema>;
23
+ /**
24
+ * 流式计算制品校验和,避免将大镜像一次性读入内存。
25
+ * @example `const checksum = await artifactChecksum("/release/app-1.2.3.tar")`
26
+ */
27
+ declare function artifactChecksum(file: string): Promise<string>;
28
+ /**
29
+ * 校验完整构建产物;缺失、损坏或非法清单均抛错,由部署边界转换为 HaiResult。
30
+ * @example `const artifact = await readDeploymentArtifact("/release/build-1")`
31
+ */
32
+ declare function readDeploymentArtifact(directory: string): Promise<DeploymentArtifact>;
33
+
5
34
  /**
6
35
  * @h-ai/deploy — 部署配置 Schema
7
36
  *
@@ -28,7 +57,7 @@ declare const PortExposeSchema: z.ZodObject<{
28
57
  /** docker-ssh 部署平台配置 */
29
58
  declare const DockerSshProviderConfigSchema: z.ZodObject<{
30
59
  type: z.ZodLiteral<"docker-ssh">;
31
- ssh: z.ZodObject<{
60
+ ssh: z.ZodOptional<z.ZodObject<{
32
61
  host: z.ZodString;
33
62
  port: z.ZodDefault<z.ZodNumber>;
34
63
  username: z.ZodString;
@@ -36,7 +65,7 @@ declare const DockerSshProviderConfigSchema: z.ZodObject<{
36
65
  knownHostsFile: z.ZodOptional<z.ZodString>;
37
66
  strictHostKeyChecking: z.ZodDefault<z.ZodBoolean>;
38
67
  connectTimeoutSeconds: z.ZodDefault<z.ZodNumber>;
39
- }, z.core.$strip>;
68
+ }, z.core.$strip>>;
40
69
  remote: z.ZodDefault<z.ZodObject<{
41
70
  baseDir: z.ZodDefault<z.ZodString>;
42
71
  runtime: z.ZodDefault<z.ZodEnum<{
@@ -57,7 +86,7 @@ declare const ProviderConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
57
86
  token: z.ZodString;
58
87
  }, z.core.$strip>, z.ZodObject<{
59
88
  type: z.ZodLiteral<"docker-ssh">;
60
- ssh: z.ZodObject<{
89
+ ssh: z.ZodOptional<z.ZodObject<{
61
90
  host: z.ZodString;
62
91
  port: z.ZodDefault<z.ZodNumber>;
63
92
  username: z.ZodString;
@@ -65,7 +94,7 @@ declare const ProviderConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
65
94
  knownHostsFile: z.ZodOptional<z.ZodString>;
66
95
  strictHostKeyChecking: z.ZodDefault<z.ZodBoolean>;
67
96
  connectTimeoutSeconds: z.ZodDefault<z.ZodNumber>;
68
- }, z.core.$strip>;
97
+ }, z.core.$strip>>;
69
98
  remote: z.ZodDefault<z.ZodObject<{
70
99
  baseDir: z.ZodDefault<z.ZodString>;
71
100
  runtime: z.ZodDefault<z.ZodEnum<{
@@ -88,12 +117,13 @@ type PortExposeConfig = z.infer<typeof PortExposeSchema>;
88
117
  type DockerSshProviderConfig = z.infer<typeof DockerSshProviderConfigSchema>;
89
118
  /** 部署模块完整配置 Schema */
90
119
  declare const DeployConfigSchema: z.ZodObject<{
120
+ environment: z.ZodOptional<z.ZodString>;
91
121
  provider: z.ZodDiscriminatedUnion<[z.ZodObject<{
92
122
  type: z.ZodLiteral<"vercel">;
93
123
  token: z.ZodString;
94
124
  }, z.core.$strip>, z.ZodObject<{
95
125
  type: z.ZodLiteral<"docker-ssh">;
96
- ssh: z.ZodObject<{
126
+ ssh: z.ZodOptional<z.ZodObject<{
97
127
  host: z.ZodString;
98
128
  port: z.ZodDefault<z.ZodNumber>;
99
129
  username: z.ZodString;
@@ -101,7 +131,7 @@ declare const DeployConfigSchema: z.ZodObject<{
101
131
  knownHostsFile: z.ZodOptional<z.ZodString>;
102
132
  strictHostKeyChecking: z.ZodDefault<z.ZodBoolean>;
103
133
  connectTimeoutSeconds: z.ZodDefault<z.ZodNumber>;
104
- }, z.core.$strip>;
134
+ }, z.core.$strip>>;
105
135
  remote: z.ZodDefault<z.ZodObject<{
106
136
  baseDir: z.ZodDefault<z.ZodString>;
107
137
  runtime: z.ZodDefault<z.ZodEnum<{
@@ -146,10 +176,9 @@ declare const DeployConfigSchema: z.ZodObject<{
146
176
  }, z.core.$strip>], "provisioner">>;
147
177
  }, z.core.$strip>>;
148
178
  container: z.ZodOptional<z.ZodObject<{
149
- runtime: z.ZodDefault<z.ZodEnum<{
150
- auto: "auto";
151
- docker: "docker";
152
- podman: "podman";
179
+ s3Engine: z.ZodDefault<z.ZodEnum<{
180
+ rustfs: "rustfs";
181
+ minio: "minio";
153
182
  }>>;
154
183
  }, z.core.$strip>>;
155
184
  }, z.core.$strip>;
@@ -158,10 +187,61 @@ type DeployConfig = z.infer<typeof DeployConfigSchema>;
158
187
  /** 部署配置输入类型(用户输入) */
159
188
  type DeployConfigInput = z.input<typeof DeployConfigSchema>;
160
189
 
190
+ /** 部署环境的加载和持久化;公开环境文件不保存真实凭据。 */
191
+
192
+ /** 部署环境快照;例如 prod 的 targetValues 只来自 `.env.prod`,不包含基础/私有覆盖。 */
193
+ interface DeploymentEnvironment {
194
+ /** 文件模式(dev/test/prod 或其他合法模式名)。 */
195
+ environment: string;
196
+ /** 环境文件的绝对目录。 */
197
+ envDir: string;
198
+ /** 合并后的部署变量,可能含私有值,不得直接记录日志。 */
199
+ values: Record<string, string>;
200
+ /** 仅目标环境文件显式声明的变量,用于判断能否“保持不变”。 */
201
+ targetValues: Record<string, string>;
202
+ }
203
+ /**
204
+ * 按部署环境解析配置;未选择的可选 Provisioner 缺少凭据时保留空值,选择完成后由 Schema 校验。
205
+ * 不修改 core 缓存或进程变量,不在 YAML 文本上拼接凭据。
206
+ * @param name - 模块配置名,例如 deploy/db/iam
207
+ * @param path - YAML 文件绝对路径
208
+ * @param values - 已加载的目标环境变量
209
+ * @returns 配置对象;解析错误已脱敏
210
+ * @example `loadDeploymentConfig('deploy', '/app/config/_deploy.yml', environment.values)`
211
+ */
212
+ declare function loadDeploymentConfig(name: string, path: string, values: Record<string, string | undefined>): HaiResult<Record<string, unknown>>;
213
+ /**
214
+ * 加载部署环境;指定环境文件缺失时返回错误并要求用户创建。
215
+ * @param options - 模式、环境目录与是否强制存在目标文件
216
+ * @param options.environment - dev/test/prod 或自定义模式
217
+ * @param options.envDir - 环境文件所在目录
218
+ * @param options.requireFile - 默认 true;扫描无显式环境时可只读取已有基础文件
219
+ * @returns 环境快照,可能包含私有值,不得直接输出
220
+ * @example `loadDeploymentEnvironment({ environment: 'prod', envDir: '.' })`
221
+ */
222
+ declare function loadDeploymentEnvironment(options: {
223
+ environment: string;
224
+ envDir: string;
225
+ requireFile?: boolean;
226
+ }): HaiResult<DeploymentEnvironment>;
227
+ /**
228
+ * 保存部署产生的变量:公共值写目标环境文件,凭据写 `.env.local`。
229
+ * 返回实际写入的变量名,调用者只展示名称或脱敏值。
230
+ * @param environment - 已加载的目标环境快照
231
+ * @param values - 需要更新的变量;未提供的项保持原状
232
+ * @param options - private 为 true 时所有值只保存在本机;适用于 SSH 地址、端口及密钥路径
233
+ * @param options.private - 是否将全部值仅保存到 .env.local
234
+ * @returns 已保存的变量名或脱敏错误
235
+ * @example `saveDeploymentEnvironment(snapshot, { HAI_DB_TYPE: 'postgresql' })`
236
+ * @example `saveDeploymentEnvironment(snapshot, { HAI_DEPLOY_PROVIDER: JSON.stringify(provider) }, { private: true })`
237
+ */
238
+ declare function saveDeploymentEnvironment(environment: DeploymentEnvironment, values: Record<string, string>, options?: {
239
+ private?: boolean;
240
+ }): HaiResult<string[]>;
241
+
161
242
  declare const HaiDeployError: {
162
243
  readonly DEPLOY_FAILED: _h_ai_core.HaiErrorDef;
163
244
  readonly PROJECT_CREATE_FAILED: _h_ai_core.HaiErrorDef;
164
- readonly BUILD_FAILED: _h_ai_core.HaiErrorDef;
165
245
  readonly UPLOAD_FAILED: _h_ai_core.HaiErrorDef;
166
246
  readonly AUTH_REQUIRED: _h_ai_core.HaiErrorDef;
167
247
  readonly AUTH_FAILED: _h_ai_core.HaiErrorDef;
@@ -173,8 +253,6 @@ declare const HaiDeployError: {
173
253
  readonly UNSUPPORTED_TYPE: _h_ai_core.HaiErrorDef;
174
254
  readonly CONFIG_ERROR: _h_ai_core.HaiErrorDef;
175
255
  readonly CREDENTIAL_ERROR: _h_ai_core.HaiErrorDef;
176
- readonly CONTAINER_RUNTIME_NOT_FOUND: _h_ai_core.HaiErrorDef;
177
- readonly CONTAINER_BUILD_FAILED: _h_ai_core.HaiErrorDef;
178
256
  readonly REMOTE_CONNECT_FAILED: _h_ai_core.HaiErrorDef;
179
257
  readonly REMOTE_COMMAND_FAILED: _h_ai_core.HaiErrorDef;
180
258
  readonly IMAGE_TRANSFER_FAILED: _h_ai_core.HaiErrorDef;
@@ -203,14 +281,48 @@ interface DeployError {
203
281
  cause?: unknown;
204
282
  }
205
283
  /** 基础设施服务类型 */
206
- type ServiceType = 'db' | 'cache' | 'storage' | 'email' | 'sms' | 'vecdb';
284
+ type ServiceType = 'db' | 'cache' | 'storage' | 'email' | 'sms' | 'vecdb' | 'ldap';
285
+ /** 每项中间件的处理方式;keep 不修改配置,也不开通服务。 */
286
+ type MiddlewareMode = 'default' | 'custom' | 'keep';
287
+ /** 扫描环境;例如 `{ environment: 'test', envDir: '/workspace/app' }`。 */
288
+ interface DeployScanOptions {
289
+ /** 环境文件模式。 */
290
+ environment?: string;
291
+ /** 环境文件目录;默认自动定位到应用或 workspace 根。 */
292
+ envDir?: string;
293
+ }
294
+ /** 依赖对应的中间件;例如 IAM 的 LDAP 位于 `iam.ldap`,可处于 disabled 状态。 */
295
+ interface MiddlewareRequirement {
296
+ /** 中间件类别。 */
297
+ service: ServiceType;
298
+ /** 生效后端标识。 */
299
+ backend: string;
300
+ /** 检测来源(依赖包或配置名),用于解释为何需要此项。 */
301
+ source: string;
302
+ /** 模块配置名。 */
303
+ configName: string;
304
+ /** 模块配置内的路径;例如 LDAP 为 ['ldap']。 */
305
+ configPath: string[];
306
+ /** 约定变量前缀。 */
307
+ envPrefix: string;
308
+ /** 生效连接配置,可能含凭据,仅用于输入默认值,不得原样输出日志。 */
309
+ config: Record<string, unknown>;
310
+ }
207
311
  /**
208
312
  * 应用扫描结果
209
313
  *
210
314
  * 由 scanner 分析应用目录后返回,描述应用的框架类型、依赖和部署需求。
211
315
  */
212
316
  interface ScanResult {
213
- /** 应用名称(来自 package.json name) */
317
+ /** 调用者指定的部署目录,对应 lockfile 中的一个 importer。 */
318
+ appDir?: string;
319
+ /** 公共环境文件目录。 */
320
+ envDir?: string;
321
+ /** 依赖与配置共同确定的中间件详情。 */
322
+ middlewares?: MiddlewareRequirement[];
323
+ /** 从运行依赖图识别的 Hai 模块;peer 和开发依赖不启用模块。 */
324
+ haiModules?: string[];
325
+ /** 应用名称(目录名称;可用 projectName 显式覆盖部署资源名)。 */
214
326
  appName: string;
215
327
  /** 是否为 SvelteKit 项目 */
216
328
  isSvelteKit: boolean;
@@ -222,8 +334,6 @@ interface ScanResult {
222
334
  requiredServices: ServiceType[];
223
335
  /** 各服务检测到的后端类型(如 db→postgresql/mysql,vecdb→qdrant),用于生成匹配的 sidecar */
224
336
  serviceBackends: Partial<Record<ServiceType, string>>;
225
- /** 构建命令 */
226
- buildCommand: string;
227
337
  }
228
338
  /**
229
339
  * 部署结果
@@ -236,7 +346,11 @@ interface DeployResult {
236
346
  /** 部署 ID */
237
347
  deploymentId: string;
238
348
  /** 部署状态 */
239
- status: 'ready' | 'building' | 'error';
349
+ status: 'ready' | 'packaged' | 'building' | 'error';
350
+ /** Compose 部署 tar 的绝对路径;包含私有配置,应安全传输。 */
351
+ bundlePath?: string;
352
+ /** 手工搬运和启动说明;仅打包不代表服务器已运行。 */
353
+ instructions?: string;
240
354
  /** 已设置的环境变量名列表 */
241
355
  envVarsSet: string[];
242
356
  /** 部署 Provider 名称(如 vercel / docker-ssh),容器部署时返回 */
@@ -275,12 +389,22 @@ interface DeployRecoveryInfo {
275
389
  }
276
390
  /** 部署选项 */
277
391
  interface DeployAppOptions {
278
- /** 项目名称(默认从 package.json name 提取) */
392
+ /** 部署环境标识;显式指定时必须存在 .env.<environment>。 */
393
+ environment?: string;
394
+ /** 环境文件所在目录,默认自动定位。 */
395
+ envDir?: string;
396
+ /** 按服务或变量前缀选择处理方式;如 HAI_REACH_PROVIDERS_1 可独立于另一邮件连接。 */
397
+ serviceModes?: Partial<Record<string, MiddlewareMode>>;
398
+ /** 项目名称(默认使用明确指定的部署目录名称)。 */
279
399
  projectName?: string;
280
- /** 是否跳过基础设施开通 */
281
- skipProvision?: boolean;
282
- /** 是否跳过构建 */
283
- skipBuild?: boolean;
400
+ /** 是否跳过全部中间件配置与开通,默认 false;例如配置完备时设为 true。 */
401
+ skipMiddleware?: boolean;
402
+ /** 已构建镜像目录;默认最近构建入口/锁文件目录下的 .hai/build/docker。 */
403
+ artifactDir?: string;
404
+ /** 只生成部署 tar,不连接 SSH;仅 docker-ssh 支持。 */
405
+ bundleOnly?: boolean;
406
+ /** 部署 tar 输出路径;默认 .hai/deploy/<环境>/bundle-<项目>-<部署ID>-<版本>.tar,自定义文件名自动补 -<版本>。 */
407
+ output?: string;
284
408
  }
285
409
  /**
286
410
  * Deploy 凭证文件操作。
@@ -338,16 +462,16 @@ interface DeployFunctions {
338
462
  *
339
463
  * @param appDir - 应用根目录路径
340
464
  */
341
- scan: (appDir: string) => Promise<HaiResult<ScanResult>>;
465
+ scan: (appDir: string, options?: DeployScanOptions) => Promise<HaiResult<ScanResult>>;
342
466
  /**
343
467
  * 对所有已配置的 Provisioner 执行基础设施开通
344
468
  *
345
469
  * @param projectName - 用于资源命名的项目名
346
470
  * @returns 所有 Provisioner 的结果列表
347
471
  */
348
- provisionAll: (projectName: string) => Promise<HaiResult<ProvisionResult[]>>;
472
+ provisionAll: (projectName: string, services?: ServiceType[]) => Promise<HaiResult<ProvisionResult[]>>;
349
473
  /**
350
- * 执行完整部署流程(provision → build → deploy)
474
+ * 部署已有构建产物(环境和中间件 → 打包 → 上传/启动);不会调用构建命令。
351
475
  *
352
476
  * @param appDir - 应用根目录路径
353
477
  * @param options - 部署选项
@@ -376,7 +500,75 @@ interface DeployFunctions {
376
500
  */
377
501
  declare const deploy: DeployFunctions;
378
502
 
503
+ /**
504
+ * @h-ai/deploy — i18n
505
+ *
506
+ * 本文件提供部署模块的 i18n 文案访问入口。
507
+ * @module deploy-i18n
508
+ */
509
+ /**
510
+ * 获取部署模块文案
511
+ *
512
+ * @param key - 文案 Key
513
+ * @param options - 插值参数与格式化选项
514
+ * @returns 本地化后的文案字符串
515
+ *
516
+ * @example
517
+ * ```ts
518
+ * const text = deployM('deploy_notInitialized')
519
+ * ```
520
+ */
521
+ declare const deployM: (key: "deploy_notInitialized" | "deploy_initFailed" | "deploy_unsupportedProviderType" | "deploy_unsupportedProvisionerType" | "deploy_configTokenRequired" | "deploy_authRequired" | "deploy_authFailed" | "deploy_projectCreateFailed" | "deploy_uploadFailed" | "deploy_deployFailed" | "deploy_provisionFailed" | "deploy_adapterMissing" | "deploy_scanFailed" | "deploy_envVarFailed" | "deploy_credentialError" | "deploy_credentialInvalidKey" | "deploy_credentialSaved" | "deploy_credentialLoaded" | "deploy_configError" | "deploy_credentialMissing" | "deploy_apiError" | "deploy_fileUploadFailed" | "deploy_provisionNoResult" | "deploy_recoveryFailure" | "deploy_recoverySuggestion" | "deploy_commandTimeout" | "deploy_commandFailed" | "deploy_remoteConnectFailed" | "deploy_remoteRuntimeMissing" | "deploy_imageTransferFailed" | "deploy_healthCheckFailed" | "deploy_invalidEnvironment" | "deploy_environmentMissing" | "deploy_environmentReadFailed" | "deploy_environmentWriteFailed" | "deploy_multipleApplications" | "deploy_purposeSqlite" | "deploy_purposeDatabase" | "deploy_purposeMemory" | "deploy_purposeLocal" | "deploy_purposeCache" | "deploy_purposeStorage" | "deploy_purposeVector" | "deploy_purposeDisabled" | "deploy_purposeLdap" | "deploy_purposeConsole" | "deploy_purposeEmail" | "deploy_purposeSms" | "deploy_webProxyInvalid" | "deploy_artifactInvalid" | "deploy_sshRequired" | "deploy_bundleInstructions" | "deploy_bundleMetadata" | "deploy_bundleOnlyContainer", options?: _h_ai_core.MessageOptions) => string;
522
+
523
+ /**
524
+ * 部署中间件的后端与连接字段目录,供扫描、CLI 和容器规划共同使用。
525
+ * 字段名与对应模块公开 Schema 保持一致,不把模块依赖等同于必须创建外部服务。
526
+ * @module deploy-middleware
527
+ */
528
+
529
+ /** 连接字段;例如 `{ name: 'port', defaultValue: '5432', kind: 'port' }`。 */
530
+ interface MiddlewareField {
531
+ /** 模块配置字段名,camelCase 不拆词。 */
532
+ name: string;
533
+ /** 无现有配置时使用的提示默认值。 */
534
+ defaultValue?: string;
535
+ /** 是否为连接所必需;可选项允许留空。 */
536
+ required?: boolean;
537
+ /** 密码输入与私有环境文件写入标记。 */
538
+ secret?: boolean;
539
+ /** 交互校验类型;端口范围为 1–65535。 */
540
+ kind?: 'port' | 'boolean' | 'number' | 'url';
541
+ /** 数值下限;未声明时为 0。 */
542
+ minimum?: number;
543
+ /** 数值上限;例如 Redis db 为 15。 */
544
+ maximum?: number;
545
+ }
546
+ /** 后端目录项;例如 PostgreSQL 对应 `backend: 'postgresql'`。 */
547
+ interface MiddlewareBackend {
548
+ /** 模块 Schema 接受的后端标识。 */
549
+ backend: string;
550
+ /** 可直接识别的产品名称。 */
551
+ label: string;
552
+ /** 用途说明的 i18n 消息键。 */
553
+ purpose: Parameters<typeof deployM>[0];
554
+ /** 云自动开通器;缺失表示不能自动开通该云服务。 */
555
+ provisioner?: 'neon' | 'upstash' | 'cloudflare-r2' | 'resend' | 'aliyun';
556
+ /** 自定义连接需要逐项输入的字段。 */
557
+ fields: MiddlewareField[];
558
+ }
559
+ /**
560
+ * 所有可部署中间件的连接目录。
561
+ * SQLite、memory、local 与 disabled 保留本地/禁用语义,不创建无关 sidecar。
562
+ * @example `DEPLOY_MIDDLEWARE.db.map(item => item.label)` 返回数据库选择项。
563
+ */
564
+ declare const DEPLOY_MIDDLEWARE: Record<ServiceType, MiddlewareBackend[]>;
565
+ /**
566
+ * 返回当前语言的后端用途说明。
567
+ * @example `describeMiddlewareBackend(DEPLOY_MIDDLEWARE.db[0])`
568
+ */
569
+ declare function describeMiddlewareBackend(backend: MiddlewareBackend): string;
570
+
379
571
  /** 读取错误中的恢复清单;仅返回明确允许展示的字段。 */
380
572
  declare function getDeployRecovery(error: HaiError): DeployRecoveryInfo | undefined;
381
573
 
382
- export { type DeployAppOptions, type DeployConfig, type DeployConfigInput, DeployConfigSchema, type DeployCredentialOperations, type DeployError, type DeployFunctions, type DeployRecoveryInfo, type DeployResult, type DockerSshProviderConfig, HaiDeployError, type PortExposeConfig, ProviderConfigSchema, type ProvisionResult, type ScanResult, type ServiceType, type SshConfig, deploy, getDeployRecovery };
574
+ export { DEPLOY_MIDDLEWARE, type DeployAppOptions, type DeployConfig, type DeployConfigInput, DeployConfigSchema, type DeployCredentialOperations, type DeployError, type DeployFunctions, type DeployRecoveryInfo, type DeployResult, type DeployScanOptions, type DeploymentArtifact, DeploymentArtifactSchema, type DeploymentEnvironment, type DockerSshProviderConfig, HaiDeployError, type MiddlewareBackend, type MiddlewareField, type MiddlewareMode, type MiddlewareRequirement, type PortExposeConfig, ProviderConfigSchema, type ProvisionResult, type ScanResult, type ServiceType, type SshConfig, artifactChecksum, deploy, describeMiddlewareBackend, getDeployRecovery, loadDeploymentConfig, loadDeploymentEnvironment, readDeploymentArtifact, saveDeploymentEnvironment };