@h-ai/deploy 1.0.0-beta.6 → 1.0.0-beta.7

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/README.en.md CHANGED
@@ -125,7 +125,7 @@ SSH settings are saved in `.env.<environment>.local`. `--bundle-only` offers to
125
125
 
126
126
  #### Configure only the middleware the application needs
127
127
 
128
- Runtime lockfile dependencies and configuration determine middleware. Choose defaults, custom connections or keep settings. With complete target-environment settings, `--yes` preserves values without asking again or provisioning cloud resources again; interactive mode still lets you select the scope. --skip-middleware skips configuration/provisioning. SQLite, memory cache and local storage need no external images. Complete bundles automatically include self-hosted middleware images. External services still require reachable destinations; cloud provisioning is not an offline operation.
128
+ Runtime lockfile dependencies of the target application and configuration determine middleware; commented configuration does not enable modules. LDAP is included only when effective `iam.login.ldap=true`, so disabled LDAP produces no prompt. Choose defaults, custom connections or keep settings. With complete target-environment settings, `--yes` preserves values without asking again or provisioning cloud resources again; interactive mode still lets you select the scope. --skip-middleware skips configuration/provisioning. SQLite, memory cache and local storage need no external images. Complete bundles automatically include self-hosted middleware images. External services still require reachable destinations; cloud provisioning is not an offline operation.
129
129
 
130
130
  Default and custom modes preserve effective settings for the same backend, including pool, operation log, public storage URLs/prefixes, Redis retry and vector search options absent from the form. Managed services replace connection selectors and credentials; old URLs, TLS/cluster modes and credentials cannot override the new service. SMTP senders and LDAP attribute mappings remain. Switching backends clears incompatible fields. Missing fields already saved in parent JSON need recovery from the original configuration or backup: restore `publicEndpoint` in the highest-priority `HAI_STORAGE`, then rebuild and deploy the bundle. Editing YAML or leaf variables hidden by that parent JSON cannot repair an old bundle. Generators prefer field variables and retain JSON arrays. Handwritten JSON remains a base and appears before its module fields; fields in the same source win. Dynamic maps, JSON text and explicit empty objects preserve their meaning. Expanding a whole-object replacement retains its highest `{}` reset marker so old YAML fields cannot reappear. Container paths stay in delivery output without changing source settings.
131
131
 
package/README.ja.md CHANGED
@@ -123,7 +123,7 @@ SSH 設定は選択環境の `.env.<環境>.local` に保存します。`--bundl
123
123
 
124
124
  #### 本当に必要なミドルウェアだけを設定する
125
125
 
126
- 実行依存と設定に基づき、既定、自分の接続、設定維持を選びます。対象環境の設定が完全なら、`--yes` は値を保持し、再入力やクラウド資源の再作成を行いません。対話モードでは今回の処理範囲を選べます。--skip-middleware は設定と開通を省略します。SQLite、メモリーキャッシュ、ローカル保存には外部イメージがありません。完全配布物には自前ミドルウェアのイメージも自動で含めます。外部サービスは接続先への到達性が必要で、クラウド開通はオフライン処理ではありません。
126
+ 対象アプリのロックファイルにある実行依存と設定に基づき、既定、自分の接続、設定維持を選びます。コメントの設定はモジュールを有効にしません。LDAP は有効な設定で `iam.login.ldap=true` の場合だけ配置対象となり、無効時には質問しません。対象環境の設定が完全なら、`--yes` は値を保持し、再入力やクラウド資源の再作成を行いません。対話モードでは今回の処理範囲を選べます。--skip-middleware は設定と開通を省略します。SQLite、メモリーキャッシュ、ローカル保存には外部イメージがありません。完全配布物には自前ミドルウェアのイメージも自動で含めます。外部サービスは接続先への到達性が必要で、クラウド開通はオフライン処理ではありません。
127
127
 
128
128
  既定とカスタムは同じバックエンドの有効な設定を保持します。フォームにない接続プール、操作ログ、ストレージ公開 URL/接頭辞、Redis 再試行、ベクトル検索設定も対象です。自前構成とクラウド開通は接続先・認証だけを更新し、古い URL、TLS/クラスター設定、認証情報を引き継ぎません。SMTP 送信元と LDAP 属性対応は保持します。バックエンド変更時は非互換項目を除去します。 生成処理は個別変数を優先し、配列は JSON を維持します。手書き JSON はモジュール細項の前に置く基礎値で、同一ソースの細項が優先されます。動的辞書、JSON テキスト、明示的な空オブジェクトの意味を維持します。全体置換を展開する際は最上位の `{}` リセットを残し、古い YAML フィールドの復活を防ぎます。コンテナー内パスは配布物のみ変更します。
129
129
 
package/README.md CHANGED
@@ -136,7 +136,7 @@ SSH 参数保存到选中环境的 `.env.<环境>.local`。`--bundle-only` 在
136
136
 
137
137
  #### 按应用真正需要的中间件处理
138
138
 
139
- 根据锁文件运行依赖和模块配置识别数据库、缓存、文件存储、向量库、LDAP、邮件等。逐项选择默认、自定义或保持。目标环境已有完整配置时,`--yes` 保持原值,不重新输入或重复云开通;交互模式仍可选择本次处理范围。配置完备可用 `--skip-middleware` 跳过向导和开通。SQLite、Memory cache、本地存储不产生外部镜像;Compose 自建服务的镜像自动加入完整交付包。外部服务仍需目标网络可达,云开通不属于完全离线部署。
139
+ 根据目标应用锁文件的运行依赖和模块配置识别数据库、缓存、文件存储、向量库、LDAP、邮件等;仅保留注释配置不会启用模块。LDAP 只有在有效配置 `iam.login.ldap=true` 时才列入部署需求,未启用时不询问。逐项选择默认、自定义或保持。目标环境已有完整配置时,`--yes` 保持原值,不重新输入或重复云开通;交互模式仍可选择本次处理范围。配置完备可用 `--skip-middleware` 跳过向导和开通。SQLite、Memory cache、本地存储不产生外部镜像;Compose 自建服务的镜像自动加入完整交付包。外部服务仍需目标网络可达,云开通不属于完全离线部署。
140
140
 
141
141
  默认和自定义模式均保留同后端的有效配置,包括表单未展示的连接池、操作日志、存储公开端点/前缀、Redis 重试和向量检索选项。自建与云开通仅重新定稿实际连接和认证;旧 URL、TLS/集群模式与凭据不能覆盖新服务,SMTP 发件人和 LDAP 属性映射继续保留。切换后端时清除不兼容字段。 生成端优先写细项,数组保留 JSON;手写 JSON 允许兜底,放在对应模块细项之前。同源细项覆盖 JSON,动态字典、JSON 文本和显式空对象保留原义;整体替换展开时以最上层 `{}` 标记阻止旧 YAML 字段恢复。容器路径只写交付配置,不反写工程源环境。
142
142
 
package/dist/index.d.ts CHANGED
@@ -458,7 +458,7 @@ interface DeployScanOptions {
458
458
  envDir?: string;
459
459
  }
460
460
  /**
461
- * 依赖对应的中间件;例如 IAM 的 LDAP 位于 `iam.ldap`,可处于 disabled 状态。
461
+ * 已启用能力对应的中间件;例如 LDAP 仅在 `iam.login.ldap` 为 true 时纳入扫描。
462
462
  * @example
463
463
  * ```ts
464
464
  * import type { MiddlewareRequirement } from '@h-ai/deploy'
package/dist/index.js CHANGED
@@ -1987,6 +1987,414 @@ var deploy_config_shapes_default = {
1987
1987
  $schema: "https://json-schema.org/draft/2020-12/schema",
1988
1988
  type: "object",
1989
1989
  properties: {
1990
+ acp: {
1991
+ type: "object",
1992
+ properties: {
1993
+ agents: {
1994
+ default: [],
1995
+ type: "array",
1996
+ items: {
1997
+ oneOf: [
1998
+ {
1999
+ type: "object",
2000
+ properties: {
2001
+ id: {
2002
+ type: "string",
2003
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2004
+ },
2005
+ name: {
2006
+ type: "string",
2007
+ minLength: 1
2008
+ },
2009
+ enabled: {
2010
+ default: true,
2011
+ type: "boolean"
2012
+ },
2013
+ adapter: {
2014
+ default: "generic",
2015
+ type: "string",
2016
+ minLength: 1
2017
+ },
2018
+ modelIds: {
2019
+ default: [],
2020
+ type: "array",
2021
+ items: {
2022
+ type: "string",
2023
+ minLength: 1
2024
+ }
2025
+ },
2026
+ defaultModelId: {
2027
+ type: "string",
2028
+ minLength: 1
2029
+ },
2030
+ environmentRefs: {
2031
+ default: {},
2032
+ type: "object",
2033
+ propertyNames: {
2034
+ type: "string",
2035
+ pattern: "^[A-Z_]\\w*$"
2036
+ },
2037
+ additionalProperties: {
2038
+ type: "string",
2039
+ pattern: "^[A-Z_]\\w*$"
2040
+ }
2041
+ },
2042
+ mode: {
2043
+ type: "string",
2044
+ const: "custom-service"
2045
+ },
2046
+ transport: {
2047
+ type: "string",
2048
+ enum: [
2049
+ "http",
2050
+ "ws"
2051
+ ]
2052
+ },
2053
+ url: {
2054
+ type: "string",
2055
+ format: "uri"
2056
+ },
2057
+ headerEnv: {
2058
+ default: {},
2059
+ type: "object",
2060
+ propertyNames: {
2061
+ type: "string"
2062
+ },
2063
+ additionalProperties: {
2064
+ type: "string"
2065
+ }
2066
+ },
2067
+ supportedTransports: {
2068
+ minItems: 1,
2069
+ type: "array",
2070
+ items: {
2071
+ type: "string",
2072
+ enum: [
2073
+ "http",
2074
+ "ws"
2075
+ ]
2076
+ }
2077
+ }
2078
+ },
2079
+ required: [
2080
+ "id",
2081
+ "name",
2082
+ "mode",
2083
+ "transport",
2084
+ "url",
2085
+ "supportedTransports"
2086
+ ],
2087
+ additionalProperties: false
2088
+ },
2089
+ {
2090
+ type: "object",
2091
+ properties: {
2092
+ id: {
2093
+ type: "string",
2094
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2095
+ },
2096
+ name: {
2097
+ type: "string",
2098
+ minLength: 1
2099
+ },
2100
+ enabled: {
2101
+ default: true,
2102
+ type: "boolean"
2103
+ },
2104
+ adapter: {
2105
+ default: "generic",
2106
+ type: "string",
2107
+ minLength: 1
2108
+ },
2109
+ modelIds: {
2110
+ default: [],
2111
+ type: "array",
2112
+ items: {
2113
+ type: "string",
2114
+ minLength: 1
2115
+ }
2116
+ },
2117
+ defaultModelId: {
2118
+ type: "string",
2119
+ minLength: 1
2120
+ },
2121
+ environmentRefs: {
2122
+ default: {},
2123
+ type: "object",
2124
+ propertyNames: {
2125
+ type: "string",
2126
+ pattern: "^[A-Z_]\\w*$"
2127
+ },
2128
+ additionalProperties: {
2129
+ type: "string",
2130
+ pattern: "^[A-Z_]\\w*$"
2131
+ }
2132
+ },
2133
+ command: {
2134
+ type: "string",
2135
+ minLength: 1
2136
+ },
2137
+ args: {
2138
+ type: "array",
2139
+ items: {
2140
+ type: "string"
2141
+ }
2142
+ },
2143
+ mode: {
2144
+ type: "string",
2145
+ const: "embedded"
2146
+ },
2147
+ transport: {
2148
+ default: "stdio",
2149
+ type: "string",
2150
+ const: "stdio"
2151
+ }
2152
+ },
2153
+ required: [
2154
+ "id",
2155
+ "name",
2156
+ "mode"
2157
+ ],
2158
+ additionalProperties: false
2159
+ },
2160
+ {
2161
+ type: "object",
2162
+ properties: {
2163
+ id: {
2164
+ type: "string",
2165
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2166
+ },
2167
+ name: {
2168
+ type: "string",
2169
+ minLength: 1
2170
+ },
2171
+ enabled: {
2172
+ default: true,
2173
+ type: "boolean"
2174
+ },
2175
+ adapter: {
2176
+ default: "generic",
2177
+ type: "string",
2178
+ minLength: 1
2179
+ },
2180
+ modelIds: {
2181
+ default: [],
2182
+ type: "array",
2183
+ items: {
2184
+ type: "string",
2185
+ minLength: 1
2186
+ }
2187
+ },
2188
+ defaultModelId: {
2189
+ type: "string",
2190
+ minLength: 1
2191
+ },
2192
+ environmentRefs: {
2193
+ default: {},
2194
+ type: "object",
2195
+ propertyNames: {
2196
+ type: "string",
2197
+ pattern: "^[A-Z_]\\w*$"
2198
+ },
2199
+ additionalProperties: {
2200
+ type: "string",
2201
+ pattern: "^[A-Z_]\\w*$"
2202
+ }
2203
+ },
2204
+ command: {
2205
+ type: "string",
2206
+ minLength: 1
2207
+ },
2208
+ args: {
2209
+ type: "array",
2210
+ items: {
2211
+ type: "string"
2212
+ }
2213
+ },
2214
+ mode: {
2215
+ type: "string",
2216
+ const: "builtin-service"
2217
+ },
2218
+ transport: {
2219
+ default: "stdio",
2220
+ type: "string",
2221
+ const: "stdio"
2222
+ },
2223
+ image: {
2224
+ type: "string",
2225
+ minLength: 1
2226
+ },
2227
+ engine: {
2228
+ default: "auto",
2229
+ type: "string",
2230
+ enum: [
2231
+ "auto",
2232
+ "podman",
2233
+ "docker"
2234
+ ]
2235
+ }
2236
+ },
2237
+ required: [
2238
+ "id",
2239
+ "name",
2240
+ "mode",
2241
+ "image"
2242
+ ],
2243
+ additionalProperties: false
2244
+ }
2245
+ ]
2246
+ }
2247
+ },
2248
+ workspaces: {
2249
+ default: [],
2250
+ type: "array",
2251
+ items: {
2252
+ type: "object",
2253
+ properties: {
2254
+ id: {
2255
+ type: "string",
2256
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2257
+ },
2258
+ storage: {
2259
+ oneOf: [
2260
+ {
2261
+ type: "object",
2262
+ properties: {
2263
+ type: {
2264
+ type: "string",
2265
+ const: "directory"
2266
+ },
2267
+ path: {
2268
+ type: "string",
2269
+ minLength: 1
2270
+ }
2271
+ },
2272
+ required: [
2273
+ "type",
2274
+ "path"
2275
+ ],
2276
+ additionalProperties: false
2277
+ },
2278
+ {
2279
+ type: "object",
2280
+ properties: {
2281
+ type: {
2282
+ type: "string",
2283
+ const: "volume"
2284
+ },
2285
+ name: {
2286
+ type: "string",
2287
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2288
+ },
2289
+ engine: {
2290
+ default: "auto",
2291
+ type: "string",
2292
+ enum: [
2293
+ "auto",
2294
+ "podman",
2295
+ "docker"
2296
+ ]
2297
+ },
2298
+ image: {
2299
+ type: "string",
2300
+ minLength: 1
2301
+ }
2302
+ },
2303
+ required: [
2304
+ "type",
2305
+ "name",
2306
+ "image"
2307
+ ],
2308
+ additionalProperties: false
2309
+ }
2310
+ ]
2311
+ },
2312
+ repositories: {
2313
+ default: [],
2314
+ type: "array",
2315
+ items: {
2316
+ type: "object",
2317
+ properties: {
2318
+ id: {
2319
+ type: "string",
2320
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2321
+ },
2322
+ url: {
2323
+ type: "string",
2324
+ minLength: 1
2325
+ },
2326
+ mainBranch: {
2327
+ type: "string",
2328
+ minLength: 1,
2329
+ maxLength: 240
2330
+ },
2331
+ remote: {
2332
+ default: "origin",
2333
+ type: "string",
2334
+ pattern: "^[a-z0-9][\\w-]{0,95}$"
2335
+ }
2336
+ },
2337
+ required: [
2338
+ "id",
2339
+ "url",
2340
+ "mainBranch"
2341
+ ],
2342
+ additionalProperties: false
2343
+ }
2344
+ },
2345
+ environmentRefs: {
2346
+ default: {},
2347
+ type: "object",
2348
+ propertyNames: {
2349
+ type: "string",
2350
+ pattern: "^[A-Z_]\\w*$"
2351
+ },
2352
+ additionalProperties: {
2353
+ type: "string",
2354
+ pattern: "^[A-Z_]\\w*$"
2355
+ }
2356
+ }
2357
+ },
2358
+ required: [
2359
+ "id",
2360
+ "storage"
2361
+ ],
2362
+ additionalProperties: false
2363
+ }
2364
+ },
2365
+ requestTimeout: {
2366
+ default: 3e4,
2367
+ type: "integer",
2368
+ exclusiveMinimum: 0,
2369
+ maximum: 9007199254740991
2370
+ },
2371
+ promptTimeout: {
2372
+ default: 6e5,
2373
+ type: "integer",
2374
+ exclusiveMinimum: 0,
2375
+ maximum: 9007199254740991
2376
+ },
2377
+ cancelTimeout: {
2378
+ default: 5e3,
2379
+ type: "integer",
2380
+ exclusiveMinimum: 0,
2381
+ maximum: 9007199254740991
2382
+ },
2383
+ maxContentBytes: {
2384
+ default: 8388608,
2385
+ type: "integer",
2386
+ exclusiveMinimum: 0,
2387
+ maximum: 9007199254740991
2388
+ },
2389
+ maxPendingEvents: {
2390
+ default: 1024,
2391
+ type: "integer",
2392
+ exclusiveMinimum: 0,
2393
+ maximum: 9007199254740991
2394
+ }
2395
+ },
2396
+ additionalProperties: false
2397
+ },
1990
2398
  llm: {
1991
2399
  type: "object",
1992
2400
  properties: {
@@ -2042,6 +2450,71 @@ var deploy_config_shapes_default = {
2042
2450
  id: {
2043
2451
  type: "string"
2044
2452
  },
2453
+ capabilities: {
2454
+ type: "object",
2455
+ properties: {
2456
+ contextWindow: {
2457
+ type: "integer",
2458
+ exclusiveMinimum: 0,
2459
+ maximum: 9007199254740991
2460
+ },
2461
+ maxOutputTokens: {
2462
+ type: "integer",
2463
+ exclusiveMinimum: 0,
2464
+ maximum: 9007199254740991
2465
+ },
2466
+ inputModalities: {
2467
+ minItems: 1,
2468
+ type: "array",
2469
+ items: {
2470
+ type: "string",
2471
+ enum: [
2472
+ "text",
2473
+ "image",
2474
+ "audio",
2475
+ "video"
2476
+ ]
2477
+ }
2478
+ },
2479
+ outputModalities: {
2480
+ minItems: 1,
2481
+ type: "array",
2482
+ items: {
2483
+ type: "string",
2484
+ enum: [
2485
+ "text",
2486
+ "image",
2487
+ "audio",
2488
+ "video"
2489
+ ]
2490
+ }
2491
+ },
2492
+ toolCalling: {
2493
+ type: "boolean"
2494
+ },
2495
+ reasoning: {
2496
+ type: "object",
2497
+ properties: {
2498
+ supported: {
2499
+ type: "boolean"
2500
+ },
2501
+ efforts: {
2502
+ minItems: 1,
2503
+ type: "array",
2504
+ items: {
2505
+ type: "string",
2506
+ minLength: 1
2507
+ }
2508
+ }
2509
+ },
2510
+ required: [
2511
+ "supported"
2512
+ ],
2513
+ additionalProperties: false
2514
+ }
2515
+ },
2516
+ additionalProperties: false
2517
+ },
2045
2518
  model: {
2046
2519
  type: "string"
2047
2520
  },
@@ -2128,6 +2601,71 @@ var deploy_config_shapes_default = {
2128
2601
  mcp: {
2129
2602
  type: "object",
2130
2603
  properties: {
2604
+ servers: {
2605
+ type: "array",
2606
+ items: {
2607
+ type: "object",
2608
+ properties: {
2609
+ id: {
2610
+ type: "string",
2611
+ minLength: 1
2612
+ },
2613
+ name: {
2614
+ type: "string",
2615
+ minLength: 1
2616
+ },
2617
+ transport: {
2618
+ type: "string",
2619
+ enum: [
2620
+ "stdio",
2621
+ "http",
2622
+ "sse"
2623
+ ]
2624
+ },
2625
+ command: {
2626
+ type: "string",
2627
+ minLength: 1
2628
+ },
2629
+ args: {
2630
+ default: [],
2631
+ type: "array",
2632
+ items: {
2633
+ type: "string"
2634
+ }
2635
+ },
2636
+ url: {
2637
+ type: "string",
2638
+ format: "uri"
2639
+ },
2640
+ environmentRefs: {
2641
+ default: {},
2642
+ type: "object",
2643
+ propertyNames: {
2644
+ type: "string"
2645
+ },
2646
+ additionalProperties: {
2647
+ type: "string"
2648
+ }
2649
+ },
2650
+ headerEnv: {
2651
+ default: {},
2652
+ type: "object",
2653
+ propertyNames: {
2654
+ type: "string"
2655
+ },
2656
+ additionalProperties: {
2657
+ type: "string"
2658
+ }
2659
+ }
2660
+ },
2661
+ required: [
2662
+ "id",
2663
+ "name",
2664
+ "transport"
2665
+ ],
2666
+ additionalProperties: false
2667
+ }
2668
+ },
2131
2669
  server: {
2132
2670
  type: "object",
2133
2671
  properties: {
@@ -5851,6 +6389,7 @@ async function scanApp(inputDir, options) {
5851
6389
  const env = loaded.data.values;
5852
6390
  const deps = graph.runtime;
5853
6391
  const configs = {};
6392
+ const enabledConfigs = /* @__PURE__ */ new Set();
5854
6393
  for (const [name, owner] of Object.entries({ db: "reldb", cache: "cache", storage: "storage", vecdb: "vecdb", iam: "iam", reach: "reach" })) {
5855
6394
  configs[name] = {};
5856
6395
  if (!deps.has(`@h-ai/${owner}`))
@@ -5860,26 +6399,28 @@ async function scanApp(inputDir, options) {
5860
6399
  if (config && !config.success)
5861
6400
  return config;
5862
6401
  configs[name] = config?.data ?? {};
6402
+ if (!configFile || Object.keys(configs[name]).length)
6403
+ enabledConfigs.add(name);
5863
6404
  }
5864
6405
  const middlewares = [];
5865
6406
  const add = (service, backend, configName = service, configPath = [], config = configs[configName] ?? {}, source = `_${configName}.yml`) => {
5866
6407
  middlewares.push({ service, backend, source, configName, configPath, envPrefix: ["HAI", configName, ...configPath].map((part) => part.toUpperCase()).join("_"), config });
5867
6408
  };
5868
- const iam = deps.has("@h-ai/iam");
5869
- if (deps.has("@h-ai/reldb"))
6409
+ const iam = enabledConfigs.has("iam");
6410
+ if (enabledConfigs.has("db"))
5870
6411
  add("db", String(configs.db.type ?? "sqlite"), "db", [], configs.db, "@h-ai/reldb / _db.yml");
5871
- if (deps.has("@h-ai/cache"))
6412
+ if (enabledConfigs.has("cache"))
5872
6413
  add("cache", String(configs.cache.type ?? "memory"), "cache", [], configs.cache, "@h-ai/cache / _cache.yml");
5873
- if (deps.has("@h-ai/storage"))
6414
+ if (enabledConfigs.has("storage"))
5874
6415
  add("storage", String(configs.storage.type ?? "local"));
5875
- if (deps.has("@h-ai/vecdb"))
6416
+ if (enabledConfigs.has("vecdb"))
5876
6417
  add("vecdb", String(configs.vecdb.type ?? "lancedb"));
5877
- if (iam) {
6418
+ if (iam && record(configs.iam.login).ldap === true) {
5878
6419
  const ldap = record(configs.iam.ldap);
5879
- add("ldap", record(configs.iam.login).ldap === true ? "ldap" : "disabled", "iam", ["ldap"], ldap, "@h-ai/iam (LDAP)");
6420
+ add("ldap", "ldap", "iam", ["ldap"], ldap, "@h-ai/iam (LDAP)");
5880
6421
  }
5881
6422
  const providers = configs.reach.providers;
5882
- if (deps.has("@h-ai/reach") && Array.isArray(providers)) {
6423
+ if (enabledConfigs.has("reach") && Array.isArray(providers)) {
5883
6424
  for (const [index, item] of providers.entries()) {
5884
6425
  const provider = record(item);
5885
6426
  const type = String(provider.type ?? "");
@@ -5888,7 +6429,7 @@ async function scanApp(inputDir, options) {
5888
6429
  add(service, type, "reach", ["providers", String(index)], provider, "@h-ai/reach");
5889
6430
  }
5890
6431
  }
5891
- if (deps.has("@h-ai/reach") && !middlewares.some((item) => item.configName === "reach"))
6432
+ if (enabledConfigs.has("reach") && !middlewares.some((item) => item.configName === "reach"))
5892
6433
  add("email", "console", "reach", ["providers", "0"], { name: "email", type: "console" }, "@h-ai/reach");
5893
6434
  const isSvelteKit = graph.build.has("@sveltejs/kit");
5894
6435
  const scan = {