@h-ai/cli 1.0.0-beta.2 → 1.0.0-beta.21

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 (254) hide show
  1. package/README.en.md +74 -154
  2. package/README.ja.md +74 -154
  3. package/README.md +74 -154
  4. package/dist/{chunk-AKV2CQZV.js → chunk-2ZL5ORQ2.js} +316 -97
  5. package/dist/chunk-2ZL5ORQ2.js.map +1 -0
  6. package/dist/{chunk-EF7WOFWZ.js → chunk-L53P43B2.js} +1312 -163
  7. package/dist/chunk-L53P43B2.js.map +1 -0
  8. package/dist/cli-config-templates-LWMD2I6V.js +5 -0
  9. package/dist/{cli-config-templates-HHFHNXBN.js.map → cli-config-templates-LWMD2I6V.js.map} +1 -1
  10. package/dist/{cli-skill-templates-PN4FLGBC.js → cli-skill-templates-D6S2OQ6X.js} +3 -3
  11. package/dist/{cli-skill-templates-PN4FLGBC.js.map → cli-skill-templates-D6S2OQ6X.js.map} +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.js +30118 -3253
  14. package/dist/index.js.map +1 -1
  15. package/dist/metafile-esm.json +1 -1
  16. package/package.json +22 -18
  17. package/templates/README.md +45 -30
  18. package/templates/apps/admin/src/routes/+layout.svelte.hbs +16 -10
  19. package/templates/apps/admin/src/routes/+page.svelte.hbs +4 -4
  20. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +17 -7
  21. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +26 -6
  22. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +2 -2
  23. package/templates/apps/api/.dockerignore.hbs +10 -0
  24. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +8 -0
  25. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +6 -1
  26. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +13 -5
  27. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +13 -5
  28. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +3 -1
  29. package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +6 -2
  30. package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +24 -2
  31. package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +4 -4
  32. package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +74 -24
  33. package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +0 -1
  34. package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +153 -37
  35. package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +39 -13
  36. package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +106 -33
  37. package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +3 -1
  38. package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +3 -1
  39. package/templates/apps/api/e2e/api-serv.spec.ts.hbs +20 -3
  40. package/templates/apps/api/e2e/capture-evidence.ts.hbs +4 -1
  41. package/templates/apps/api/eslint.config.js.hbs +3 -1
  42. package/templates/apps/api/images/serv.Dockerfile.hbs +15 -10
  43. package/templates/apps/api/playwright.config.ts.hbs +23 -19
  44. package/templates/apps/api/pnpm-workspace.yaml.hbs +27 -16
  45. package/templates/apps/fullstack/.dockerignore.hbs +10 -0
  46. package/templates/apps/fullstack/.gitignore.hbs +7 -2
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +14 -12
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +5 -3
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +10 -2
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +1 -1
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +10 -2
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +0 -1
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +0 -1
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +4 -1
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +16 -4
  56. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +10 -8
  57. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +3 -3
  58. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +8 -2
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +0 -1
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +0 -2
  61. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +4 -1
  62. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +16 -4
  63. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +2 -0
  64. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +9 -9
  65. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +10 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +1 -0
  67. package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +0 -1
  68. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +0 -2
  69. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +4 -1
  70. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +19 -5
  71. package/templates/apps/fullstack/docs/security-configuration.md.hbs +4 -1
  72. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +140 -28
  73. package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +19 -5
  74. package/templates/apps/fullstack/eslint.config.js.hbs +3 -1
  75. package/templates/apps/fullstack/images/serv.Dockerfile.hbs +19 -11
  76. package/templates/apps/fullstack/images/web.Dockerfile.hbs +17 -8
  77. package/templates/apps/fullstack/package.json.hbs +2 -1
  78. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +7 -5
  79. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +114 -23
  80. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +57 -11
  81. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +3 -1
  82. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +17 -7
  83. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +13 -7
  84. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +17 -7
  85. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -4
  86. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +65 -30
  87. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +0 -1
  88. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -2
  89. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +69 -21
  90. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +21 -5
  91. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +63 -11
  92. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -1
  93. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +3 -1
  94. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +147 -33
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +43 -12
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +146 -30
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +33 -10
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +142 -26
  99. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +6 -2
  100. package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +3 -1
  101. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +48 -66
  102. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +1 -0
  103. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +1 -0
  104. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +1 -0
  105. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +9 -2
  106. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +0 -3
  107. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +15 -3
  108. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +33 -7
  109. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +16 -2
  110. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +104 -13
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +37 -7
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +9 -3
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +25 -3
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +133 -19
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +14 -2
  116. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +66 -34
  117. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +132 -30
  118. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +8 -2
  119. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +23 -5
  120. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +143 -21
  121. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -2
  122. package/templates/apps/fullstack/playwright.config.ts.hbs +25 -3
  123. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +30 -14
  124. package/templates/apps/h5/src/routes/+layout.svelte.hbs +74 -30
  125. package/templates/apps/h5/src/routes/+page.svelte.hbs +2 -2
  126. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +2 -2
  127. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +2 -2
  128. package/templates/apps/mobile-app/capacitor.config.ts.hbs +5 -2
  129. package/templates/apps/mobile-app/messages/en-US.json +2 -2
  130. package/templates/apps/mobile-app/messages/ja-JP.json +2 -2
  131. package/templates/apps/mobile-app/messages/zh-CN.json +2 -2
  132. package/templates/apps/mobile-app/src/App.svelte.hbs +17 -5
  133. package/templates/apps/mobile-app/src/lib/api.ts.hbs +20 -6
  134. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +8 -1
  135. package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +6 -2
  136. package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -1
  137. package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +5 -1
  138. package/templates/apps/website/scripts/static-website.mjs.hbs +19 -6
  139. package/templates/apps/website/src/routes/+layout.svelte.hbs +56 -29
  140. package/templates/apps/website/src/routes/+page.svelte.hbs +4 -4
  141. package/templates/apps/website/src/routes/about/+page.svelte.hbs +2 -2
  142. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +2 -2
  143. package/templates/apps/website/src/routes/services/+page.svelte.hbs +20 -5
  144. package/templates/base/.dockerignore.hbs +10 -0
  145. package/templates/base/.gitignore.hbs +7 -2
  146. package/templates/base/e2e/app.spec.ts.hbs +130 -36
  147. package/templates/base/eslint-rules.js +44 -25
  148. package/templates/base/eslint.config.js.hbs +3 -1
  149. package/templates/base/images/web.Dockerfile.hbs +25 -14
  150. package/templates/base/package.json.hbs +13 -7
  151. package/templates/base/patches/daisyui-5.7.50.patch +8 -0
  152. package/templates/base/patches/deepmerge-4.3.1.patch +51 -0
  153. package/templates/base/playwright.config.ts +3 -1
  154. package/templates/base/pnpm-workspace.yaml.hbs +33 -16
  155. package/templates/base/src/app.d.ts.hbs +1 -1
  156. package/templates/base/src/app.html.hbs +1 -0
  157. package/templates/base/src/hooks.server.ts.hbs +44 -33
  158. package/templates/base/src/lib/build-metadata.ts.hbs +0 -1
  159. package/templates/base/src/lib/server/init.ts.hbs +146 -35
  160. package/templates/base/src/lib/server/kit-config.ts.hbs +7 -4
  161. package/templates/base/src/routes/+layout.server.ts.hbs +2 -2
  162. package/templates/base/svelte.config.js.hbs +10 -100
  163. package/templates/base/tests/scaffold.test.ts.hbs +12 -3
  164. package/templates/base/tsconfig.json.hbs +7 -4
  165. package/templates/base/vite.config.ts.hbs +108 -14
  166. package/templates/base/vitest.config.ts.hbs +6 -2
  167. package/templates/features/ai/routes/api/chat/+server.ts +3 -1
  168. package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +3 -3
  169. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +3 -3
  170. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +3 -3
  171. package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +3 -3
  172. package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +3 -3
  173. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +3 -3
  174. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +3 -3
  175. package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +3 -3
  176. package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +3 -3
  177. package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +3 -3
  178. package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +3 -3
  179. package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +3 -3
  180. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +14 -3
  181. package/templates/shared/browser-check/startup.js +115 -0
  182. package/templates/shared/browser-check/update.css +37 -0
  183. package/templates/shared/browser-check/update.html +19 -0
  184. package/templates/shared/browser-startup.spec.ts +23 -0
  185. package/templates/shared/build-metadata.ts +18 -4
  186. package/templates/shared/e2e-env.ts +22 -6
  187. package/templates/shared/native-name.d.mts +5 -0
  188. package/templates/shared/native-name.mjs +94 -0
  189. package/templates/shared/public-base-path.mjs +17 -4
  190. package/templates/shared/run-e2e.mjs +46 -12
  191. package/templates/shared/run-node.mjs +56 -0
  192. package/templates/shared/run-tauri.mjs +74 -0
  193. package/templates/shared/vite-runtime-config.ts +9 -3
  194. package/templates/skills/AGENTS.md +10 -73
  195. package/templates/skills/bridges/admin/AGENTS.md +9 -65
  196. package/templates/skills/bridges/api/AGENTS.md +8 -59
  197. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +9 -54
  198. package/templates/skills/bridges/h5/AGENTS.md +8 -63
  199. package/templates/skills/bridges/mobile-app/AGENTS.md +8 -62
  200. package/templates/skills/bridges/website/AGENTS.md +8 -63
  201. package/templates/skills/hai-ai/SKILL.md +6 -2
  202. package/templates/skills/hai-ai/acp.md +153 -0
  203. package/templates/skills/hai-ai/guide.md +27 -12
  204. package/templates/skills/hai-ai/reference.md +24 -15
  205. package/templates/skills/hai-ai/resources.md +69 -0
  206. package/templates/skills/hai-api-client/SKILL.md +1 -1
  207. package/templates/skills/hai-api-client/reference.md +3 -1
  208. package/templates/skills/hai-app-create/collaboration.md +7 -0
  209. package/templates/skills/hai-app-create/development.md +19 -10
  210. package/templates/skills/hai-app-create/project.md +33 -0
  211. package/templates/skills/hai-app-create/reference.md +10 -10
  212. package/templates/skills/hai-app-tests/reference.md +1 -1
  213. package/templates/skills/hai-app-tests/validation.md +1 -0
  214. package/templates/skills/hai-build/SKILL.md +19 -9
  215. package/templates/skills/hai-build/paths.md +4 -2
  216. package/templates/skills/hai-build/reference.md +26 -8
  217. package/templates/skills/hai-cache/reference.md +6 -2
  218. package/templates/skills/hai-capacitor/SKILL.md +1 -0
  219. package/templates/skills/hai-capacitor/reference.md +24 -0
  220. package/templates/skills/hai-ci/SKILL.md +3 -0
  221. package/templates/skills/hai-core/SKILL.md +9 -4
  222. package/templates/skills/hai-core/reference.md +40 -10
  223. package/templates/skills/hai-core/request-access.md +2 -2
  224. package/templates/skills/hai-crypto/SKILL.md +2 -2
  225. package/templates/skills/hai-crypto/reference.md +7 -3
  226. package/templates/skills/hai-deploy/SKILL.md +41 -5
  227. package/templates/skills/hai-deploy/middleware.md +26 -14
  228. package/templates/skills/hai-framework-sync/SKILL.md +13 -9
  229. package/templates/skills/hai-framework-sync/sync.md +2 -0
  230. package/templates/skills/hai-iam/reference.md +2 -2
  231. package/templates/skills/hai-kit/SKILL.md +1 -1
  232. package/templates/skills/hai-kit/reference.md +19 -5
  233. package/templates/skills/hai-payment/reference.md +41 -17
  234. package/templates/skills/hai-reach/SKILL.md +3 -1
  235. package/templates/skills/hai-reach/reference.md +29 -9
  236. package/templates/skills/hai-reldb/SKILL.md +1 -1
  237. package/templates/skills/hai-reldb/reference.md +9 -2
  238. package/templates/skills/hai-scheduler/reference.md +1 -1
  239. package/templates/skills/hai-serv/SKILL.md +2 -1
  240. package/templates/skills/hai-serv/reference.md +26 -15
  241. package/templates/skills/hai-storage/reference.md +23 -6
  242. package/templates/skills/hai-ui/SKILL.md +11 -6
  243. package/templates/skills/hai-ui/charts.md +51 -0
  244. package/templates/skills/hai-ui/guide.md +1 -1
  245. package/templates/skills/hai-ui/reference.md +58 -38
  246. package/templates/skills/hai-vecdb/reference.md +8 -3
  247. package/dist/chunk-AKV2CQZV.js.map +0 -1
  248. package/dist/chunk-EF7WOFWZ.js.map +0 -1
  249. package/dist/chunk-MUHRBJSW.js +0 -29272
  250. package/dist/chunk-MUHRBJSW.js.map +0 -1
  251. package/dist/cli-config-templates-HHFHNXBN.js +0 -5
  252. package/dist/src-TEBHR5I5.js +0 -5
  253. package/dist/src-TEBHR5I5.js.map +0 -1
  254. package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +0 -18
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { parseDocument, isScalar, stringify, isMap, isSeq, Scalar } from 'yaml';
2
+ import { parseDocument, LineCounter, isScalar, stringify, isMap, isSeq, Scalar } from 'yaml';
3
3
 
4
4
  // src/commands/cli-config-catalog.json
5
5
  var cli_config_catalog_default = [
@@ -195,6 +195,358 @@ var cli_config_catalog_default = [
195
195
  value: "x-api-key",
196
196
  constraint: "\u5B57\u7B26\u4E32"
197
197
  },
198
+ {
199
+ name: "HAI_AI_ACP",
200
+ module: "ai",
201
+ path: "ai.acp",
202
+ description: "ACP \u4F1A\u8BDD\u4E0E\u6267\u884C\u9650\u5236\uFF08\u4EC5 Node \u670D\u52A1\u7AEF\uFF09\u3002",
203
+ value: "",
204
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
205
+ },
206
+ {
207
+ name: "HAI_AI_ACP_AGENTS",
208
+ module: "ai",
209
+ path: "ai.acp.agents",
210
+ description: "\u914D\u7F6E\u6587\u4EF6\u5B9A\u4E49\u7684\u53EA\u8BFB\u667A\u80FD\u4F53\uFF0C\u4E0E\u6570\u636E\u5E93\u8BB0\u5F55\u6309 ID \u5408\u5E76\u3002",
211
+ value: "[]",
212
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
213
+ },
214
+ {
215
+ name: "HAI_AI_ACP_AGENTS_0",
216
+ module: "ai",
217
+ path: "ai.acp.agents.0",
218
+ description: "\u914D\u7F6E\u6587\u4EF6\u5B9A\u4E49\u7684\u53EA\u8BFB\u667A\u80FD\u4F53\uFF0C\u4E0E\u6570\u636E\u5E93\u8BB0\u5F55\u6309 ID \u5408\u5E76\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
219
+ value: "",
220
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
221
+ },
222
+ {
223
+ name: "HAI_AI_ACP_AGENTS_0_ADAPTER",
224
+ module: "ai",
225
+ path: "ai.acp.agents.0.adapter",
226
+ description: "\u539F\u751F\u914D\u7F6E\u9002\u914D\u5668\u540D\u79F0\uFF0C\u9ED8\u8BA4 generic\u3002",
227
+ value: "generic",
228
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
229
+ },
230
+ {
231
+ name: "HAI_AI_ACP_AGENTS_0_ARGS",
232
+ module: "ai",
233
+ path: "ai.acp.agents.0.args",
234
+ description: "\u539F\u751F\u542F\u52A8\u53C2\u6570\uFF0C\u7701\u7565\u65F6\u7531\u9002\u914D\u5668\u63D0\u4F9B\u9ED8\u8BA4\u503C\u3002",
235
+ value: "",
236
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
237
+ },
238
+ {
239
+ name: "HAI_AI_ACP_AGENTS_0_ARGS_0",
240
+ module: "ai",
241
+ path: "ai.acp.agents.0.args.0",
242
+ description: "\u539F\u751F\u542F\u52A8\u53C2\u6570\uFF0C\u7701\u7565\u65F6\u7531\u9002\u914D\u5668\u63D0\u4F9B\u9ED8\u8BA4\u503C\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
243
+ value: "",
244
+ constraint: "\u5B57\u7B26\u4E32"
245
+ },
246
+ {
247
+ name: "HAI_AI_ACP_AGENTS_0_COMMAND",
248
+ module: "ai",
249
+ path: "ai.acp.agents.0.command",
250
+ description: "\u53EF\u9009\u539F\u751F\u7A0B\u5E8F\u8986\u76D6\uFF0C\u4F7F\u7528\u53C2\u6570\u6570\u7EC4\u6267\u884C\uFF0C\u4E0D\u7ECF\u8FC7 shell\u3002",
251
+ value: "",
252
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
253
+ },
254
+ {
255
+ name: "HAI_AI_ACP_AGENTS_0_DEFAULTMODELID",
256
+ module: "ai",
257
+ path: "ai.acp.agents.0.defaultModelId",
258
+ description: "\u9ED8\u8BA4\u9009\u62E9\u7684\u6A21\u578B ID\uFF0C\u5FC5\u987B\u5B58\u5728\u4E8E modelIds\u3002",
259
+ value: "",
260
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
261
+ },
262
+ {
263
+ name: "HAI_AI_ACP_AGENTS_0_ENABLED",
264
+ module: "ai",
265
+ path: "ai.acp.agents.0.enabled",
266
+ description: "\u9ED8\u8BA4\u542F\u7528\uFF0C\u7981\u7528\u540E\u7981\u6B62\u65B0\u5EFA\u548C\u6062\u590D\u4F1A\u8BDD\u3002",
267
+ value: "true",
268
+ constraint: "true | false"
269
+ },
270
+ {
271
+ name: "HAI_AI_ACP_AGENTS_0_ENGINE",
272
+ module: "ai",
273
+ path: "ai.acp.agents.0.engine",
274
+ description: "auto \u4F18\u5148\u53EF\u7528 Podman\uFF0C\u518D\u9009 Docker\uFF1B\u663E\u5F0F\u9009\u62E9\u4E0D\u81EA\u52A8\u964D\u7EA7\u3002",
275
+ value: "auto",
276
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aauto | podman | docker"
277
+ },
278
+ {
279
+ name: "HAI_AI_ACP_AGENTS_0_ENVIRONMENTREFS",
280
+ module: "ai",
281
+ path: "ai.acp.agents.0.environmentRefs",
282
+ description: "\u76EE\u6807\u73AF\u5883\u53D8\u91CF\u540D\u5230\u5BBF\u4E3B\u73AF\u5883\u53D8\u91CF\u540D\u7684\u6620\u5C04\uFF1B\u4FDD\u5B58\u5F15\u7528\u800C\u975E\u660E\u6587\u51ED\u636E\u3002",
283
+ value: "{}",
284
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
285
+ },
286
+ {
287
+ name: "HAI_AI_ACP_AGENTS_0_HEADERENV",
288
+ module: "ai",
289
+ path: "ai.acp.agents.0.headerEnv",
290
+ description: "\u8FDC\u7A0B\u8BA4\u8BC1 Header \u540D\u5230\u5BBF\u4E3B\u53D8\u91CF\u540D\u7684\u6620\u5C04\u3002",
291
+ value: "{}",
292
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
293
+ },
294
+ {
295
+ name: "HAI_AI_ACP_AGENTS_0_ID",
296
+ module: "ai",
297
+ path: "ai.acp.agents.0.id",
298
+ description: "\u6E05\u5355\u4E2D\u7684\u552F\u4E00 ID\uFF1B\u540C\u65F6\u7528\u4E8E\u53D7\u7BA1\u7406\u76EE\u5F55\u540D\u3002",
299
+ value: "",
300
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6B63\u5219 ^[a-z0-9][\\w-]{0,95}$"
301
+ },
302
+ {
303
+ name: "HAI_AI_ACP_AGENTS_0_IMAGE",
304
+ module: "ai",
305
+ path: "ai.acp.agents.0.image",
306
+ description: "\u5DF2\u90E8\u7F72\u7684 Agent \u955C\u50CF\uFF0C\u5DE5\u4F5C\u533A\u548C\u667A\u80FD\u4F53\u9700\u4F7F\u7528\u540C\u4E00\u955C\u50CF\u3002",
307
+ value: "",
308
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
309
+ },
310
+ {
311
+ name: "HAI_AI_ACP_AGENTS_0_MODE",
312
+ module: "ai",
313
+ path: "ai.acp.agents.0.mode",
314
+ description: "\u63A5\u5165\u6A21\u5F0F\uFF1A\u81EA\u5B9A\u4E49\u8FDC\u7A0B\u670D\u52A1\u3001\u672C\u673A\u5185\u5D4C\u8FDB\u7A0B\u6216\u6258\u7BA1\u5BB9\u5668\u3002",
315
+ value: "custom-service",
316
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Acustom-service | embedded | builtin-service"
317
+ },
318
+ {
319
+ name: "HAI_AI_ACP_AGENTS_0_MODELIDS",
320
+ module: "ai",
321
+ path: "ai.acp.agents.0.modelIds",
322
+ description: "\u7ED1\u5B9A Hai LLM \u6A21\u578B ID\uFF1B\u9ED8\u8BA4\u7A7A\u6570\u7EC4\u3002",
323
+ value: "[]",
324
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
325
+ },
326
+ {
327
+ name: "HAI_AI_ACP_AGENTS_0_MODELIDS_0",
328
+ module: "ai",
329
+ path: "ai.acp.agents.0.modelIds.0",
330
+ description: "\u7ED1\u5B9A Hai LLM \u6A21\u578B ID\uFF1B\u9ED8\u8BA4\u7A7A\u6570\u7EC4\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
331
+ value: "",
332
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
333
+ },
334
+ {
335
+ name: "HAI_AI_ACP_AGENTS_0_NAME",
336
+ module: "ai",
337
+ path: "ai.acp.agents.0.name",
338
+ description: "\u667A\u80FD\u4F53\u7684\u53EF\u8BFB\u540D\u79F0\u3002",
339
+ value: "",
340
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
341
+ },
342
+ {
343
+ name: "HAI_AI_ACP_AGENTS_0_SUPPORTEDTRANSPORTS",
344
+ module: "ai",
345
+ path: "ai.acp.agents.0.supportedTransports",
346
+ description: "\u81EA\u5B9A\u4E49\u670D\u52A1\u663E\u5F0F\u58F0\u660E\u7684\u539F\u751F HTTP/WS \u80FD\u529B\u3002",
347
+ value: "",
348
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55\uFF1B\u6700\u5C11\u9879\u6570 1"
349
+ },
350
+ {
351
+ name: "HAI_AI_ACP_AGENTS_0_SUPPORTEDTRANSPORTS_0",
352
+ module: "ai",
353
+ path: "ai.acp.agents.0.supportedTransports.0",
354
+ description: "\u81EA\u5B9A\u4E49\u670D\u52A1\u663E\u5F0F\u58F0\u660E\u7684\u539F\u751F HTTP/WS \u80FD\u529B\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
355
+ value: "http",
356
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Ahttp | ws"
357
+ },
358
+ {
359
+ name: "HAI_AI_ACP_AGENTS_0_TRANSPORT",
360
+ module: "ai",
361
+ path: "ai.acp.agents.0.transport",
362
+ description: "\u667A\u80FD\u4F53\u539F\u751F\u652F\u6301\u7684\u4F20\u8F93\uFF1B\u4E0D\u81EA\u52A8\u8F6C\u6362 stdio \u548C HTTP/WS\u3002",
363
+ value: "http",
364
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Ahttp | ws | stdio"
365
+ },
366
+ {
367
+ name: "HAI_AI_ACP_AGENTS_0_URL",
368
+ module: "ai",
369
+ path: "ai.acp.agents.0.url",
370
+ description: "\u8FDC\u7A0B\u5730\u5740\uFF0C\u4E0D\u5141\u8BB8\u547D\u4EE4\u9009\u9879\u548C\u6362\u884C\u3002",
371
+ value: "",
372
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F uri"
373
+ },
374
+ {
375
+ name: "HAI_AI_ACP_CANCELTIMEOUT",
376
+ module: "ai",
377
+ path: "ai.acp.cancelTimeout",
378
+ description: "\u53D6\u6D88\u540E\u7B49\u5F85\u7EC8\u6001\u7684\u4E0A\u9650\uFF0C\u6BEB\u79D2\u3002",
379
+ value: "5000",
380
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
381
+ },
382
+ {
383
+ name: "HAI_AI_ACP_MAXCONTENTBYTES",
384
+ module: "ai",
385
+ path: "ai.acp.maxContentBytes",
386
+ description: "\u5355\u8F6E\u8F93\u5165\u548C\u7D2F\u8BA1\u8F93\u51FA\u7684\u5B57\u8282\u4E0A\u9650\u3002",
387
+ value: "8388608",
388
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
389
+ },
390
+ {
391
+ name: "HAI_AI_ACP_MAXPENDINGEVENTS",
392
+ module: "ai",
393
+ path: "ai.acp.maxPendingEvents",
394
+ description: "\u672A\u6D88\u8D39\u4E8B\u4EF6\u6570\u91CF\u4E0A\u9650\u3002",
395
+ value: "1024",
396
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
397
+ },
398
+ {
399
+ name: "HAI_AI_ACP_PROMPTTIMEOUT",
400
+ module: "ai",
401
+ path: "ai.acp.promptTimeout",
402
+ description: "\u5355\u8F6E\u4EFB\u52A1\u8D85\u65F6\uFF0C\u6BEB\u79D2\u3002",
403
+ value: "600000",
404
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
405
+ },
406
+ {
407
+ name: "HAI_AI_ACP_REQUESTTIMEOUT",
408
+ module: "ai",
409
+ path: "ai.acp.requestTimeout",
410
+ description: "\u63E1\u624B\u548C\u63A7\u5236\u8BF7\u6C42\u8D85\u65F6\uFF0C\u6BEB\u79D2\u3002",
411
+ value: "30000",
412
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
413
+ },
414
+ {
415
+ name: "HAI_AI_ACP_WORKSPACES",
416
+ module: "ai",
417
+ path: "ai.acp.workspaces",
418
+ description: "\u914D\u7F6E\u6587\u4EF6\u5B9A\u4E49\u7684\u53EA\u8BFB\u5DE5\u4F5C\u533A\uFF0C\u4E0E\u6570\u636E\u5E93\u8BB0\u5F55\u6309 ID \u5408\u5E76\u3002",
419
+ value: "[]",
420
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
421
+ },
422
+ {
423
+ name: "HAI_AI_ACP_WORKSPACES_0",
424
+ module: "ai",
425
+ path: "ai.acp.workspaces.0",
426
+ description: "\u914D\u7F6E\u6587\u4EF6\u5B9A\u4E49\u7684\u53EA\u8BFB\u5DE5\u4F5C\u533A\uFF0C\u4E0E\u6570\u636E\u5E93\u8BB0\u5F55\u6309 ID \u5408\u5E76\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
427
+ value: "",
428
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
429
+ },
430
+ {
431
+ name: "HAI_AI_ACP_WORKSPACES_0_ENVIRONMENTREFS",
432
+ module: "ai",
433
+ path: "ai.acp.workspaces.0.environmentRefs",
434
+ description: "\u5DE5\u4F5C\u533A\u5386\u53F2\u5171\u7528\u53D8\u91CF\u6620\u5C04\uFF1BAgent \u4E13\u7528\u51ED\u636E\u5E94\u914D\u7F6E\u5728 Agent \u5B9A\u4E49\u4E2D\u3002",
435
+ value: "{}",
436
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
437
+ },
438
+ {
439
+ name: "HAI_AI_ACP_WORKSPACES_0_GITENVIRONMENTREFS",
440
+ module: "ai",
441
+ path: "ai.acp.workspaces.0.gitEnvironmentRefs",
442
+ description: "\u4EC5\u4F9B\u53D7\u7BA1 Git \u8FDC\u7A0B\u64CD\u4F5C\u4F7F\u7528\u7684\u73AF\u5883\u53D8\u91CF\u5F15\u7528\uFF0C\u503C\u4E0D\u4F20\u7ED9 Agent \u6216\u672C\u5730\u63D0\u4EA4\u3002",
443
+ value: "{}",
444
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
445
+ },
446
+ {
447
+ name: "HAI_AI_ACP_WORKSPACES_0_ID",
448
+ module: "ai",
449
+ path: "ai.acp.workspaces.0.id",
450
+ description: "\u6E05\u5355\u4E2D\u7684\u552F\u4E00 ID\uFF1B\u540C\u65F6\u7528\u4E8E\u53D7\u7BA1\u7406\u76EE\u5F55\u540D\u3002",
451
+ value: "",
452
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6B63\u5219 ^[a-z0-9][\\w-]{0,95}$"
453
+ },
454
+ {
455
+ name: "HAI_AI_ACP_WORKSPACES_0_REPOSITORIES",
456
+ module: "ai",
457
+ path: "ai.acp.workspaces.0.repositories",
458
+ description: "\u591A\u4E2A Git \u5DE5\u7A0B\uFF1B\u9ED8\u8BA4\u7A7A\u6570\u7EC4\uFF0C\u4E0D\u4F7F\u7528 Git \u65F6\u4EC5\u521B\u5EFA\u6587\u4EF6\u76EE\u5F55\u3002",
459
+ value: "[]",
460
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
461
+ },
462
+ {
463
+ name: "HAI_AI_ACP_WORKSPACES_0_REPOSITORIES_0",
464
+ module: "ai",
465
+ path: "ai.acp.workspaces.0.repositories.0",
466
+ description: "\u591A\u4E2A Git \u5DE5\u7A0B\uFF1B\u9ED8\u8BA4\u7A7A\u6570\u7EC4\uFF0C\u4E0D\u4F7F\u7528 Git \u65F6\u4EC5\u521B\u5EFA\u6587\u4EF6\u76EE\u5F55\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
467
+ value: "",
468
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
469
+ },
470
+ {
471
+ name: "HAI_AI_ACP_WORKSPACES_0_REPOSITORIES_0_ID",
472
+ module: "ai",
473
+ path: "ai.acp.workspaces.0.repositories.0.id",
474
+ description: "\u6E05\u5355\u4E2D\u7684\u552F\u4E00 ID\uFF1B\u540C\u65F6\u7528\u4E8E\u53D7\u7BA1\u7406\u76EE\u5F55\u540D\u3002",
475
+ value: "",
476
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6B63\u5219 ^[a-z0-9][\\w-]{0,95}$"
477
+ },
478
+ {
479
+ name: "HAI_AI_ACP_WORKSPACES_0_REPOSITORIES_0_MAINBRANCH",
480
+ module: "ai",
481
+ path: "ai.acp.workspaces.0.repositories.0.mainBranch",
482
+ description: "\u8BE5\u5DE5\u7A0B\u660E\u786E\u6307\u5B9A\u7684\u4E3B\u5206\u652F\uFF0C\u66F4\u65B0\u548C merge-main \u53D1\u5E03\u5747\u4F7F\u7528\u6B64\u503C\u3002",
483
+ value: "",
484
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1\uFF1B\u6700\u5927\u5B57\u7B26\u6570 240"
485
+ },
486
+ {
487
+ name: "HAI_AI_ACP_WORKSPACES_0_REPOSITORIES_0_REMOTE",
488
+ module: "ai",
489
+ path: "ai.acp.workspaces.0.repositories.0.remote",
490
+ description: "Git remote \u540D\uFF0C\u9ED8\u8BA4 origin\u3002",
491
+ value: "origin",
492
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6B63\u5219 ^[a-z0-9][\\w-]{0,95}$"
493
+ },
494
+ {
495
+ name: "HAI_AI_ACP_WORKSPACES_0_REPOSITORIES_0_URL",
496
+ module: "ai",
497
+ path: "ai.acp.workspaces.0.repositories.0.url",
498
+ description: "\u8FDC\u7A0B\u5730\u5740\uFF0C\u4E0D\u5141\u8BB8\u547D\u4EE4\u9009\u9879\u548C\u6362\u884C\u3002",
499
+ value: "",
500
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
501
+ },
502
+ {
503
+ name: "HAI_AI_ACP_WORKSPACES_0_STORAGE",
504
+ module: "ai",
505
+ path: "ai.acp.workspaces.0.storage",
506
+ description: "\u6301\u4E45\u5B58\u50A8\u4F4D\u7F6E\uFF1Bdirectory \u4F9B\u672C\u673A\uFF0Cvolume \u4F9B\u6258\u7BA1\u5BB9\u5668\u3002",
507
+ value: "",
508
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
509
+ },
510
+ {
511
+ name: "HAI_AI_ACP_WORKSPACES_0_STORAGE_ENGINE",
512
+ module: "ai",
513
+ path: "ai.acp.workspaces.0.storage.engine",
514
+ description: "auto \u4F18\u5148\u53EF\u7528 Podman\uFF0C\u518D\u9009 Docker\uFF1B\u663E\u5F0F\u9009\u62E9\u4E0D\u81EA\u52A8\u964D\u7EA7\u3002",
515
+ value: "auto",
516
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aauto | podman | docker"
517
+ },
518
+ {
519
+ name: "HAI_AI_ACP_WORKSPACES_0_STORAGE_IMAGE",
520
+ module: "ai",
521
+ path: "ai.acp.workspaces.0.storage.image",
522
+ description: "\u5DF2\u90E8\u7F72\u7684 Agent \u955C\u50CF\uFF0C\u5DE5\u4F5C\u533A\u548C\u667A\u80FD\u4F53\u9700\u4F7F\u7528\u540C\u4E00\u955C\u50CF\u3002",
523
+ value: "",
524
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
525
+ },
526
+ {
527
+ name: "HAI_AI_ACP_WORKSPACES_0_STORAGE_NAME",
528
+ module: "ai",
529
+ path: "ai.acp.workspaces.0.storage.name",
530
+ description: "\u53EF\u8BFB\u540D\u79F0\uFF1Bvolume \u65F6\u8868\u793A\u6301\u4E45\u5377\u540D\u3002",
531
+ value: "",
532
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6B63\u5219 ^[a-z0-9][\\w-]{0,95}$"
533
+ },
534
+ {
535
+ name: "HAI_AI_ACP_WORKSPACES_0_STORAGE_PATH",
536
+ module: "ai",
537
+ path: "ai.acp.workspaces.0.storage.path",
538
+ description: "\u672C\u673A\u7EDD\u5BF9\u6216\u76F8\u5BF9\u76EE\u5F55\uFF0C\u8FD0\u884C\u65F6\u5F52\u4E00\u5316\u4E3A\u771F\u5B9E\u7EDD\u5BF9\u8DEF\u5F84\u3002",
539
+ value: "",
540
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
541
+ },
542
+ {
543
+ name: "HAI_AI_ACP_WORKSPACES_0_STORAGE_TYPE",
544
+ module: "ai",
545
+ path: "ai.acp.workspaces.0.storage.type",
546
+ description: "\u5B58\u50A8\u7C7B\u578B\u5224\u522B\u5B57\u6BB5\u3002",
547
+ value: "directory",
548
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Adirectory | volume"
549
+ },
198
550
  {
199
551
  name: "HAI_AI_AUDIO",
200
552
  module: "ai",
@@ -859,19 +1211,11 @@ var cli_config_catalog_default = [
859
1211
  value: "",
860
1212
  constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
861
1213
  },
862
- {
863
- name: "HAI_AI_LLM_API",
864
- module: "ai",
865
- path: "ai.llm.api",
866
- description: "\u5168\u5C40 API \u534F\u8BAE\uFF08\u5404\u6A21\u578B fallback\uFF0C\u9ED8\u8BA4 `'chat'`\uFF1B\u53EF\u9009 `chat` / `responses` / `anthropic`\uFF09",
867
- value: "chat",
868
- constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Achat | responses | anthropic"
869
- },
870
1214
  {
871
1215
  name: "HAI_AI_LLM_APIKEY",
872
1216
  module: "ai",
873
1217
  path: "ai.llm.apiKey",
874
- description: "\u5168\u5C40 API Key\uFF08\u5404\u6A21\u578B fallback\uFF1B\u672A\u63D0\u4F9B\u65F6\u56DE\u9000\u5230 `process.env.HAI_AI_LLM_APIKEY` \u6216 `process.env.OPENAI_API_KEY`\uFF09",
1218
+ description: "\u9ED8\u8BA4\u670D\u52A1\u5BC6\u94A5\uFF1B\u6A21\u578B\u9879\u53EF\u5355\u72EC\u8986\u76D6\u3002\u672A\u586B\u5199\u65F6\u8BFB\u53D6 HAI_AI_LLM_APIKEY \u6216\u5BF9\u5E94\u4F9B\u5E94\u5546\u5BC6\u94A5\u53D8\u91CF\uFF0C\u771F\u5B9E\u503C\u53EA\u653E\u670D\u52A1\u7AEF\u3002",
875
1219
  value: "",
876
1220
  constraint: "string,null"
877
1221
  },
@@ -879,7 +1223,7 @@ var cli_config_catalog_default = [
879
1223
  name: "HAI_AI_LLM_BASEURL",
880
1224
  module: "ai",
881
1225
  path: "ai.llm.baseUrl",
882
- description: "\u5168\u5C40 API \u57FA\u7840 URL\uFF08\u5404\u6A21\u578B fallback\uFF1B\u672A\u63D0\u4F9B\u65F6\u56DE\u9000\u5230 `process.env.HAI_AI_LLM_BASEURL` \u6216 `process.env.OPENAI_BASE_URL`\uFF09",
1226
+ description: "\u9ED8\u8BA4\u6A21\u578B\u670D\u52A1\u5730\u5740\uFF1B\u4F7F\u7528\u4EE3\u7406\u65F6\u586B\u5199\uFF0C\u6A21\u578B\u9879\u53EF\u8986\u76D6\u3002\u672A\u586B\u5199\u65F6\u6309\u534F\u8BAE\u8BFB\u53D6\u73AF\u5883\u5730\u5740\u6216\u4F7F\u7528\u4F9B\u5E94\u5546\u9ED8\u8BA4\u5730\u5740\u3002",
883
1227
  value: "",
884
1228
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F uri"
885
1229
  },
@@ -887,7 +1231,7 @@ var cli_config_catalog_default = [
887
1231
  name: "HAI_AI_LLM_MAXTOKENS",
888
1232
  module: "ai",
889
1233
  path: "ai.llm.maxTokens",
890
- description: "\u5168\u5C40\u6700\u5927 Token \u6570\uFF08\u5404\u6A21\u578B fallback\uFF0C\u9ED8\u8BA4 `4096`\uFF09",
1234
+ description: "\u5355\u6B21\u56DE\u7B54\u6700\u591A\u751F\u6210\u591A\u5C11 Token\uFF0C\u9ED8\u8BA4 4096\uFF1B\u6A21\u578B\u9879\u53EF\u8986\u76D6\uFF0C\u9700\u7B26\u5408\u4F9B\u5E94\u5546\u9650\u5236\u3002",
891
1235
  value: "4096",
892
1236
  constraint: "\u6570\u5B57\uFF1B> 0"
893
1237
  },
@@ -915,14 +1259,6 @@ var cli_config_catalog_default = [
915
1259
  value: "",
916
1260
  constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
917
1261
  },
918
- {
919
- name: "HAI_AI_LLM_MODELS_0_API",
920
- module: "ai",
921
- path: "ai.llm.models.0.api",
922
- description: "API \u534F\u8BAE\uFF08\u53EF\u9009\uFF0C\u672A\u6307\u5B9A\u65F6\u56DE\u9000\u5168\u5C40 `api`\uFF0C\u518D\u56DE\u9000 `chat`\uFF1B\u51B3\u5B9A\u8D70 Chat Completions / Responses / Anthropic\uFF09",
923
- value: "chat",
924
- constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Achat | responses | anthropic"
925
- },
926
1262
  {
927
1263
  name: "HAI_AI_LLM_MODELS_0_APIKEY",
928
1264
  module: "ai",
@@ -936,9 +1272,105 @@ var cli_config_catalog_default = [
936
1272
  module: "ai",
937
1273
  path: "ai.llm.models.0.baseUrl",
938
1274
  description: "Base URL \u8986\u76D6\uFF08\u53EF\u9009\uFF09",
939
- value: "",
1275
+ value: "https://your-responses-service.example/v1",
940
1276
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F uri"
941
1277
  },
1278
+ {
1279
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES",
1280
+ module: "ai",
1281
+ path: "ai.llm.models.0.capabilities",
1282
+ description: "\u5DF2\u786E\u8BA4\u7684\u6A21\u578B\u80FD\u529B\uFF0C\u7F3A\u7701\u8868\u793A\u672A\u77E5",
1283
+ value: "",
1284
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
1285
+ },
1286
+ {
1287
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_CONTEXTWINDOW",
1288
+ module: "ai",
1289
+ path: "ai.llm.models.0.capabilities.contextWindow",
1290
+ description: "\u53EF\u7528\u4E0A\u4E0B\u6587\u603B\u5BB9\u91CF\uFF08Token\uFF09\uFF1B\u672A\u77E5\u65F6\u7701\u7565\uFF0C\u4E0D\u7531\u8F93\u51FA\u9884\u7B97\u63A8\u65AD\u3002",
1291
+ value: "",
1292
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
1293
+ },
1294
+ {
1295
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_INPUTMODALITIES",
1296
+ module: "ai",
1297
+ path: "ai.llm.models.0.capabilities.inputModalities",
1298
+ description: "\u5DF2\u786E\u8BA4\u652F\u6301\u7684\u8F93\u5165\u6A21\u6001\uFF1B\u672A\u77E5\u65F6\u7701\u7565\u3002",
1299
+ value: "",
1300
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55\uFF1B\u6700\u5C11\u9879\u6570 1"
1301
+ },
1302
+ {
1303
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_INPUTMODALITIES_0",
1304
+ module: "ai",
1305
+ path: "ai.llm.models.0.capabilities.inputModalities.0",
1306
+ description: "\u5DF2\u786E\u8BA4\u652F\u6301\u7684\u8F93\u5165\u6A21\u6001\uFF1B\u672A\u77E5\u65F6\u7701\u7565\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
1307
+ value: "text",
1308
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Atext | image | audio | video"
1309
+ },
1310
+ {
1311
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_MAXOUTPUTTOKENS",
1312
+ module: "ai",
1313
+ path: "ai.llm.models.0.capabilities.maxOutputTokens",
1314
+ description: "\u6A21\u578B\u5355\u6B21\u8F93\u51FA\u80FD\u529B\u4E0A\u9650\uFF08Token\uFF09\uFF1B\u4E0E\u9ED8\u8BA4 maxTokens \u9884\u7B97\u4E0D\u540C\u3002",
1315
+ value: "",
1316
+ constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
1317
+ },
1318
+ {
1319
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_OUTPUTMODALITIES",
1320
+ module: "ai",
1321
+ path: "ai.llm.models.0.capabilities.outputModalities",
1322
+ description: "\u5DF2\u786E\u8BA4\u652F\u6301\u7684\u8F93\u51FA\u6A21\u6001\uFF1B\u4ECD\u9700\u8C03\u7528\u63A5\u53E3\u652F\u6301\u3002",
1323
+ value: "",
1324
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55\uFF1B\u6700\u5C11\u9879\u6570 1"
1325
+ },
1326
+ {
1327
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_OUTPUTMODALITIES_0",
1328
+ module: "ai",
1329
+ path: "ai.llm.models.0.capabilities.outputModalities.0",
1330
+ description: "\u5DF2\u786E\u8BA4\u652F\u6301\u7684\u8F93\u51FA\u6A21\u6001\uFF1B\u4ECD\u9700\u8C03\u7528\u63A5\u53E3\u652F\u6301\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
1331
+ value: "text",
1332
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Atext | image | audio | video"
1333
+ },
1334
+ {
1335
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_REASONING",
1336
+ module: "ai",
1337
+ path: "ai.llm.models.0.capabilities.reasoning",
1338
+ description: "\u63A8\u7406\u80FD\u529B\u5143\u6570\u636E\uFF0C\u4E0D\u81EA\u52A8\u542F\u7528\u63A8\u7406\u8BF7\u6C42\u53C2\u6570\u3002",
1339
+ value: "",
1340
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
1341
+ },
1342
+ {
1343
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_REASONING_EFFORTS",
1344
+ module: "ai",
1345
+ path: "ai.llm.models.0.capabilities.reasoning.efforts",
1346
+ description: "\u5DF2\u786E\u8BA4\u53EF\u9009\u62E9\u7684\u63A8\u7406\u7EA7\u522B\u3002",
1347
+ value: "",
1348
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55\uFF1B\u6700\u5C11\u9879\u6570 1"
1349
+ },
1350
+ {
1351
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_REASONING_EFFORTS_0",
1352
+ module: "ai",
1353
+ path: "ai.llm.models.0.capabilities.reasoning.efforts.0",
1354
+ description: "\u5DF2\u786E\u8BA4\u53EF\u9009\u62E9\u7684\u63A8\u7406\u7EA7\u522B\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
1355
+ value: "",
1356
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
1357
+ },
1358
+ {
1359
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_REASONING_SUPPORTED",
1360
+ module: "ai",
1361
+ path: "ai.llm.models.0.capabilities.reasoning.supported",
1362
+ description: "\u662F\u5426\u652F\u6301\u63A8\u7406\u80FD\u529B\u3002",
1363
+ value: "",
1364
+ constraint: "true | false"
1365
+ },
1366
+ {
1367
+ name: "HAI_AI_LLM_MODELS_0_CAPABILITIES_TOOLCALLING",
1368
+ module: "ai",
1369
+ path: "ai.llm.models.0.capabilities.toolCalling",
1370
+ description: "\u6A21\u578B\u662F\u5426\u652F\u6301\u51FD\u6570\u5DE5\u5177\u8C03\u7528\uFF1B\u672A\u77E5\u65F6\u7701\u7565\u3002",
1371
+ value: "",
1372
+ constraint: "true | false"
1373
+ },
942
1374
  {
943
1375
  name: "HAI_AI_LLM_MODELS_0_ID",
944
1376
  module: "ai",
@@ -960,9 +1392,17 @@ var cli_config_catalog_default = [
960
1392
  module: "ai",
961
1393
  path: "ai.llm.models.0.model",
962
1394
  description: "\u6A21\u578B\u540D\u79F0\uFF08\u4F20\u7ED9 API \u7684\u5B9E\u9645\u6A21\u578B\u540D\uFF09",
963
- value: "",
1395
+ value: "your-coding-model",
964
1396
  constraint: "\u5B57\u7B26\u4E32"
965
1397
  },
1398
+ {
1399
+ name: "HAI_AI_LLM_MODELS_0_PROTOCOL",
1400
+ module: "ai",
1401
+ path: "ai.llm.models.0.protocol",
1402
+ description: "API \u534F\u8BAE\uFF08\u53EF\u9009\uFF0C\u672A\u6307\u5B9A\u65F6\u56DE\u9000\u5168\u5C40 `protocol`\uFF0C\u518D\u56DE\u9000 `chat`\uFF1B\u51B3\u5B9A\u8D70 Chat Completions / Responses / Anthropic\uFF09",
1403
+ value: "chat",
1404
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Achat | responses | anthropic"
1405
+ },
966
1406
  {
967
1407
  name: "HAI_AI_LLM_MODELS_0_TEMPERATURE",
968
1408
  module: "ai",
@@ -979,6 +1419,14 @@ var cli_config_catalog_default = [
979
1419
  value: "",
980
1420
  constraint: "\u6570\u5B57\uFF1B> 0"
981
1421
  },
1422
+ {
1423
+ name: "HAI_AI_LLM_PROTOCOL",
1424
+ module: "ai",
1425
+ path: "ai.llm.protocol",
1426
+ description: "\u9ED8\u8BA4\u8BF7\u6C42\u683C\u5F0F\uFF1Achat \u4E3A Chat Completions\uFF0Cresponses \u4E3A OpenAI Responses\uFF0Canthropic \u4E3A Anthropic Messages\uFF1B\u6A21\u578B\u9879\u53EF\u8986\u76D6\u3002",
1427
+ value: "chat",
1428
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Achat | responses | anthropic"
1429
+ },
982
1430
  {
983
1431
  name: "HAI_AI_LLM_SCENARIOS",
984
1432
  module: "ai",
@@ -1079,7 +1527,7 @@ var cli_config_catalog_default = [
1079
1527
  name: "HAI_AI_LLM_TEMPERATURE",
1080
1528
  module: "ai",
1081
1529
  path: "ai.llm.temperature",
1082
- description: "\u5168\u5C40\u91C7\u6837\u6E29\u5EA6\uFF08\u5404\u6A21\u578B fallback\uFF0C\u8303\u56F4 `[0, 2]`\uFF0C\u9ED8\u8BA4 `0.7`\uFF09",
1530
+ description: "\u56DE\u7B54\u7684\u968F\u673A\u7A0B\u5EA6\uFF0C0\u20132\uFF0C\u9ED8\u8BA4 0.7\uFF1B\u8F83\u4F4E\u901A\u5E38\u66F4\u7A33\u5B9A\uFF0C\u6A21\u578B\u9879\u53EF\u8986\u76D6\uFF0C\u90E8\u5206\u6A21\u578B\u4E0D\u652F\u6301\u81EA\u5B9A\u4E49\u3002",
1083
1531
  value: "0.7",
1084
1532
  constraint: "\u6570\u5B57\uFF1B>= 0\uFF1B<= 2"
1085
1533
  },
@@ -1095,7 +1543,7 @@ var cli_config_catalog_default = [
1095
1543
  name: "HAI_AI_LLM_TIMEOUT",
1096
1544
  module: "ai",
1097
1545
  path: "ai.llm.timeout",
1098
- description: "\u5168\u5C40\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4\uFF08\u5404\u6A21\u578B fallback\uFF0C\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 `60000`\uFF09",
1546
+ description: "\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u6700\u591A\u7B49\u5F85\u591A\u5C11\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 60000\uFF1B\u6A21\u578B\u9879\u53EF\u8986\u76D6\u3002",
1099
1547
  value: "60000",
1100
1548
  constraint: "\u6570\u5B57\uFF1B> 0"
1101
1549
  },
@@ -1163,6 +1611,94 @@ var cli_config_catalog_default = [
1163
1611
  value: "1.0.0",
1164
1612
  constraint: "\u5B57\u7B26\u4E32"
1165
1613
  },
1614
+ {
1615
+ name: "HAI_AI_MCP_SERVERS",
1616
+ module: "ai",
1617
+ path: "ai.mcp.servers",
1618
+ description: "\u5916\u90E8 MCP \u670D\u52A1\u53EA\u8BFB\u6E05\u5355\uFF1B\u4E0E\u6570\u636E\u5E93\u8BB0\u5F55\u5408\u5E76\u4F9B\u53D7\u7BA1 Agent \u4F7F\u7528\u3002",
1619
+ value: "",
1620
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
1621
+ },
1622
+ {
1623
+ name: "HAI_AI_MCP_SERVERS_0",
1624
+ module: "ai",
1625
+ path: "ai.mcp.servers.0",
1626
+ description: "\u5916\u90E8 MCP \u670D\u52A1\u53EA\u8BFB\u6E05\u5355\uFF1B\u4E0E\u6570\u636E\u5E93\u8BB0\u5F55\u5408\u5E76\u4F9B\u53D7\u7BA1 Agent \u4F7F\u7528\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
1627
+ value: "",
1628
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
1629
+ },
1630
+ {
1631
+ name: "HAI_AI_MCP_SERVERS_0_ARGS",
1632
+ module: "ai",
1633
+ path: "ai.mcp.servers.0.args",
1634
+ description: "stdio \u53C2\u6570\uFF0C\u4E0D\u4F7F\u7528 shell \u62FC\u63A5\u3002",
1635
+ value: "[]",
1636
+ constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
1637
+ },
1638
+ {
1639
+ name: "HAI_AI_MCP_SERVERS_0_ARGS_0",
1640
+ module: "ai",
1641
+ path: "ai.mcp.servers.0.args.0",
1642
+ description: "stdio \u53C2\u6570\uFF0C\u4E0D\u4F7F\u7528 shell \u62FC\u63A5\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
1643
+ value: "",
1644
+ constraint: "\u5B57\u7B26\u4E32"
1645
+ },
1646
+ {
1647
+ name: "HAI_AI_MCP_SERVERS_0_COMMAND",
1648
+ module: "ai",
1649
+ path: "ai.mcp.servers.0.command",
1650
+ description: "stdio \u7A0B\u5E8F\u8DEF\u5F84\uFF1B\u4EC5\u53EF\u4FE1\u670D\u52A1\u7AEF\u914D\u7F6E\u3002",
1651
+ value: "",
1652
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
1653
+ },
1654
+ {
1655
+ name: "HAI_AI_MCP_SERVERS_0_ENVIRONMENTREFS",
1656
+ module: "ai",
1657
+ path: "ai.mcp.servers.0.environmentRefs",
1658
+ description: "stdio \u53D8\u91CF\u540D\u5230\u5BBF\u4E3B\u51ED\u636E\u53D8\u91CF\u540D\u7684\u6620\u5C04\u3002",
1659
+ value: "{}",
1660
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
1661
+ },
1662
+ {
1663
+ name: "HAI_AI_MCP_SERVERS_0_HEADERENV",
1664
+ module: "ai",
1665
+ path: "ai.mcp.servers.0.headerEnv",
1666
+ description: "\u8BA4\u8BC1 Header \u540D\u5230\u5BBF\u4E3B\u51ED\u636E\u53D8\u91CF\u540D\u7684\u6620\u5C04\u3002",
1667
+ value: "{}",
1668
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
1669
+ },
1670
+ {
1671
+ name: "HAI_AI_MCP_SERVERS_0_ID",
1672
+ module: "ai",
1673
+ path: "ai.mcp.servers.0.id",
1674
+ description: "\u670D\u52A1\u552F\u4E00\u6807\u8BC6\u3002",
1675
+ value: "",
1676
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
1677
+ },
1678
+ {
1679
+ name: "HAI_AI_MCP_SERVERS_0_NAME",
1680
+ module: "ai",
1681
+ path: "ai.mcp.servers.0.name",
1682
+ description: "\u4F20\u7ED9\u539F\u751F MCP \u5BA2\u6237\u7AEF\u7684\u670D\u52A1\u540D\u3002",
1683
+ value: "",
1684
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
1685
+ },
1686
+ {
1687
+ name: "HAI_AI_MCP_SERVERS_0_TRANSPORT",
1688
+ module: "ai",
1689
+ path: "ai.mcp.servers.0.transport",
1690
+ description: "\u539F\u751F MCP \u4F20\u8F93\u7C7B\u578B\u3002",
1691
+ value: "stdio",
1692
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Astdio | http | sse"
1693
+ },
1694
+ {
1695
+ name: "HAI_AI_MCP_SERVERS_0_URL",
1696
+ module: "ai",
1697
+ path: "ai.mcp.servers.0.url",
1698
+ description: "HTTP/SSE \u5730\u5740\u3002",
1699
+ value: "",
1700
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F uri"
1701
+ },
1166
1702
  {
1167
1703
  name: "HAI_AI_MEMORY",
1168
1704
  module: "ai",
@@ -1175,7 +1711,7 @@ var cli_config_catalog_default = [
1175
1711
  name: "HAI_AI_MEMORY_ALLOWEPHEMERALFALLBACK",
1176
1712
  module: "ai",
1177
1713
  path: "ai.memory.allowEphemeralFallback",
1178
- description: "\u662F\u5426\u5141\u8BB8\u5728\u914D\u7F6E\u4E86\u6301\u4E45\u5316\u5411\u91CF\u540E\u7AEF\u4F46 mem0 \u65E0\u6CD5\u6620\u5C04\u65F6\u9000\u56DE\u5185\u5B58\u5B58\u50A8\uFF08\u9ED8\u8BA4 false\uFF09 \u4EC5\u5F71\u54CD `provider='mem0'`\uFF1A\u5F53\u524D\u6846\u67B6\u9002\u914D\u4EC5\u6620\u5C04 qdrant\uFF1Bpgvector \u7684 SDK \u8FDE\u63A5\u65E0\u6CD5\u516C\u5F00\u5173\u95ED\uFF0C\u6240\u6709\u73AF\u5883\u62D2\u7EDD\u3002\u5E95\u5C42 vecdb \u662F lancedb / chroma / \u672A\u77E5\u540E\u7AEF\u65F6\uFF0C\u9ED8\u8BA4 fail-fast\uFF08\u521D\u59CB\u5316\u5931\u8D25\uFF09\uFF0C\u907F\u514D\u670D\u52A1\u91CD\u542F\u540E\u8BB0\u5FC6\u9759\u9ED8\u4E22\u5931\uFF1B \u4EC5\u5F53\u663E\u5F0F\u8BBE\u4E3A true \u65F6\u624D\u5728\u5F00\u53D1\u6216\u660E\u786E E2E \u73AF\u5883\u9000\u56DE\u5185\u5B58\u5B58\u50A8\uFF08\u6570\u636E\u4E0D\u6301\u4E45\uFF09\u3002 \u751F\u4EA7\u59CB\u7EC8\u8981\u6C42\u5B9E\u9645\u6301\u4E45\u5316\u8FDE\u63A5\uFF0C\u4E0D\u80FD\u901A\u8FC7\u6B64\u5F00\u5173\u7ED5\u8FC7\u5171\u4EAB\u72B6\u6001\u8981\u6C42\u3002",
1714
+ description: "\u662F\u5426\u5141\u8BB8\u5728\u914D\u7F6E\u4E86\u6301\u4E45\u5316\u5411\u91CF\u540E\u7AEF\u4F46 mem0 \u65E0\u6CD5\u6620\u5C04\u65F6\u9000\u56DE\u5185\u5B58\u5B58\u50A8\uFF08\u9ED8\u8BA4 false\uFF09 \u4EC5\u5F71\u54CD `provider='mem0'`\uFF1A\u5F53\u524D\u6846\u67B6\u9002\u914D\u4EC5\u6620\u5C04 qdrant\uFF1B\u5176\u5B83\u6301\u4E45\u5316\u540E\u7AEF\u4F7F\u7528 native Provider\u3002\u5E95\u5C42 vecdb \u662F lancedb / chroma / \u672A\u77E5\u540E\u7AEF\u65F6\uFF0C\u9ED8\u8BA4 fail-fast\uFF08\u521D\u59CB\u5316\u5931\u8D25\uFF09\uFF0C\u907F\u514D\u670D\u52A1\u91CD\u542F\u540E\u8BB0\u5FC6\u9759\u9ED8\u4E22\u5931\uFF1B \u4EC5\u5F53\u663E\u5F0F\u8BBE\u4E3A true \u65F6\u624D\u5728\u5F00\u53D1\u6216\u660E\u786E E2E \u73AF\u5883\u9000\u56DE\u5185\u5B58\u5B58\u50A8\uFF08\u6570\u636E\u4E0D\u6301\u4E45\uFF09\u3002 \u751F\u4EA7\u59CB\u7EC8\u8981\u6C42\u5B9E\u9645\u6301\u4E45\u5316\u8FDE\u63A5\uFF0C\u4E0D\u80FD\u901A\u8FC7\u6B64\u5F00\u5173\u7ED5\u8FC7\u5171\u4EAB\u72B6\u6001\u8981\u6C42\u3002",
1179
1715
  value: "false",
1180
1716
  constraint: "true | false"
1181
1717
  },
@@ -1223,7 +1759,7 @@ var cli_config_catalog_default = [
1223
1759
  name: "HAI_AI_MEMORY_PROVIDER",
1224
1760
  module: "ai",
1225
1761
  path: "ai.memory.provider",
1226
- description: "\u8BB0\u5FC6\u540E\u7AEF\uFF1Anative \u4F7F\u7528\u6846\u67B6\u539F\u751F\u5B58\u50A8\u4E0E\u6279\u91CF\u5408\u5E76\uFF1Bmem0 \u5C06\u6846\u67B6\u63D0\u53D6\u7ED3\u679C\u5199\u5165\u53D7\u652F\u6301\u7684\u5D4C\u5165\u5F0F SDK \u540E\u7AEF",
1762
+ description: "\u8BB0\u5FC6\u540E\u7AEF\uFF1Anative \u4F7F\u7528\u6846\u67B6\u539F\u751F\u5B58\u50A8\u4E0E\u6279\u91CF\u5408\u5E76\uFF1Bmem0 \u5C06\u6846\u67B6\u63D0\u53D6\u7ED3\u679C\u4EE5 Mem0 \u6570\u636E\u683C\u5F0F\u5199\u5165 Qdrant",
1227
1763
  value: "native",
1228
1764
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Anative | mem0"
1229
1765
  },
@@ -1247,7 +1783,7 @@ var cli_config_catalog_default = [
1247
1783
  name: "HAI_AI_MEMORY_WRITEBACKRELATEDTOPK",
1248
1784
  module: "ai",
1249
1785
  path: "ai.memory.writebackRelatedTopK",
1250
- description: "\u5199\u56DE / \u5408\u5E76\u65F6\u68C0\u7D22\u76F8\u5173\u8BB0\u5FC6\u7684\u6570\u91CF\uFF08native \u4E0E mem0 \u5171\u7528\uFF0C\u9ED8\u8BA4 20\uFF09",
1786
+ description: "\u5199\u56DE / \u5408\u5E76\u65F6\u68C0\u7D22\u76F8\u5173\u8BB0\u5FC6\u7684\u6570\u91CF\uFF08\u4EC5 native\uFF0C\u9ED8\u8BA4 20\uFF09",
1251
1787
  value: "20",
1252
1788
  constraint: "\u6574\u6570\uFF1B<= 9007199254740991\uFF1B> 0"
1253
1789
  },
@@ -1363,6 +1899,38 @@ var cli_config_catalog_default = [
1363
1899
  value: "0.25",
1364
1900
  constraint: "\u6570\u5B57\uFF1B> 0"
1365
1901
  },
1902
+ {
1903
+ name: "HAI_ANDROID_KEY_ALIAS",
1904
+ module: "android",
1905
+ path: "HAI_ANDROID_KEY_ALIAS",
1906
+ description: "Android \u5BB9\u5668\u53D1\u5E03\u7B7E\u540D\u5BC6\u94A5\u522B\u540D",
1907
+ value: "",
1908
+ constraint: "\u5BC6\u94A5\u5E93\u5185\u7528\u4E8E APK \u7B7E\u540D\u7684\u522B\u540D"
1909
+ },
1910
+ {
1911
+ name: "HAI_ANDROID_KEY_PASSWORD",
1912
+ module: "android",
1913
+ path: "HAI_ANDROID_KEY_PASSWORD",
1914
+ description: "Android \u5BB9\u5668\u53D1\u5E03\u7B7E\u540D\u79C1\u94A5\u5BC6\u7801",
1915
+ value: "",
1916
+ constraint: "\u4EC5\u7531\u6784\u5EFA\u8FDB\u7A0B\u6216 CI \u6CE8\u5165\u7684\u654F\u611F\u5B57\u7B26\u4E32"
1917
+ },
1918
+ {
1919
+ name: "HAI_ANDROID_KEYSTORE",
1920
+ module: "android",
1921
+ path: "HAI_ANDROID_KEYSTORE",
1922
+ description: "Android \u5BB9\u5668\u53D1\u5E03\u7B7E\u540D\u5BC6\u94A5\u5E93",
1923
+ value: "",
1924
+ constraint: "\u5BBF\u4E3B\u6587\u4EF6\u8DEF\u5F84\uFF1B\u76F8\u5BF9\u8DEF\u5F84\u4ECE\u9879\u76EE\u6839\u89E3\u6790\uFF0C\u4EC5\u53EA\u8BFB\u6302\u8F7D\u5230\u7B7E\u540D\u5BB9\u5668"
1925
+ },
1926
+ {
1927
+ name: "HAI_ANDROID_STORE_PASSWORD",
1928
+ module: "android",
1929
+ path: "HAI_ANDROID_STORE_PASSWORD",
1930
+ description: "Android \u5BB9\u5668\u53D1\u5E03\u7B7E\u540D\u5BC6\u94A5\u5E93\u5BC6\u7801",
1931
+ value: "",
1932
+ constraint: "\u4EC5\u7531\u6784\u5EFA\u8FDB\u7A0B\u6216 CI \u6CE8\u5165\u7684\u654F\u611F\u5B57\u7B26\u4E32"
1933
+ },
1366
1934
  {
1367
1935
  name: "HAI_AUDIT",
1368
1936
  module: "audit",
@@ -2031,7 +2599,7 @@ var cli_config_catalog_default = [
2031
2599
  name: "HAI_CORE_LOGGING_REDACT",
2032
2600
  module: "core",
2033
2601
  path: "core.logging.redact",
2034
- description: "\u8981\u8131\u654F\u7684\u5B57\u6BB5\u8DEF\u5F84\u5217\u8868\uFF08\u5982 ['password', 'token']\uFF0C\u9ED8\u8BA4 []\uFF09",
2602
+ description: "\u989D\u5916\u4E1A\u52A1\u9690\u79C1\u7684\u65E5\u5FD7\u5B57\u6BB5\u8DEF\u5F84\uFF0C\u5982 customer.email\u3001recipients[*].phone\uFF1B* \u5339\u914D\u4E00\u5C42\uFF0C\u533A\u5206\u5927\u5C0F\u5199\uFF0C\u9ED8\u8BA4 []\u3002\u5DF2\u77E5\u5BC6\u7801/\u4EE4\u724C\u59CB\u7EC8\u8131\u654F\u3002",
2035
2603
  value: "[]",
2036
2604
  constraint: "JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55"
2037
2605
  },
@@ -2039,7 +2607,7 @@ var cli_config_catalog_default = [
2039
2607
  name: "HAI_CORE_LOGGING_REDACT_0",
2040
2608
  module: "core",
2041
2609
  path: "core.logging.redact.0",
2042
- description: "\u8981\u8131\u654F\u7684\u5B57\u6BB5\u8DEF\u5F84\u5217\u8868\uFF08\u5982 ['password', 'token']\uFF0C\u9ED8\u8BA4 []\uFF09\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
2610
+ description: "\u989D\u5916\u4E1A\u52A1\u9690\u79C1\u7684\u65E5\u5FD7\u5B57\u6BB5\u8DEF\u5F84\uFF0C\u5982 customer.email\u3001recipients[*].phone\uFF1B* \u5339\u914D\u4E00\u5C42\uFF0C\u533A\u5206\u5927\u5C0F\u5199\uFF0C\u9ED8\u8BA4 []\u3002\u5DF2\u77E5\u5BC6\u7801/\u4EE4\u724C\u59CB\u7EC8\u8131\u654F\u3002\uFF1B\u6B64\u53D8\u91CF\u6574\u4F53\u66FF\u6362\u5355\u4E2A\u6570\u7EC4\u9879",
2043
2611
  value: "",
2044
2612
  constraint: "\u5B57\u7B26\u4E32"
2045
2613
  },
@@ -2363,6 +2931,54 @@ var cli_config_catalog_default = [
2363
2931
  value: "",
2364
2932
  constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2365
2933
  },
2934
+ {
2935
+ name: "HAI_DEPLOY_CONTAINER_COMPOSE",
2936
+ module: "deploy",
2937
+ path: "deploy.container.compose",
2938
+ description: "\u4EE5\u9879\u76EE\u955C\u50CF\u89D2\u8272\u4E3A\u5355\u4F4D\u9644\u52A0 Compose \u8FD0\u884C\u53C2\u6570\u3002",
2939
+ value: "",
2940
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2941
+ },
2942
+ {
2943
+ name: "HAI_DEPLOY_CONTAINER_COMPOSE_SERVICES",
2944
+ module: "deploy",
2945
+ path: "deploy.container.compose.services",
2946
+ description: "\u6309\u5DF2\u6784\u5EFA\u9879\u76EE\u7684\u955C\u50CF\u89D2\u8272\u5206\u522B\u8BBE\u7F6E\u5BB9\u5668\u6269\u5C55\u3002",
2947
+ value: "",
2948
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2949
+ },
2950
+ {
2951
+ name: "HAI_DEPLOY_CONTAINER_COMPOSE_SERVICES_SERV",
2952
+ module: "deploy",
2953
+ path: "deploy.container.compose.services.serv",
2954
+ description: "API \u540E\u7AEF\u5BB9\u5668\u7684 Compose \u6269\u5C55\u3002",
2955
+ value: "",
2956
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2957
+ },
2958
+ {
2959
+ name: "HAI_DEPLOY_CONTAINER_COMPOSE_SERVICES_SERV_EXTRA_HOSTS",
2960
+ module: "deploy",
2961
+ path: "deploy.container.compose.services.serv.extra_hosts",
2962
+ description: "\u5BB9\u5668\u5185\u7684\u4E3B\u673A\u540D\u5230 IPv4 \u6216 IPv6 \u5730\u5740\u6620\u5C04\uFF0C\u4E0D\u80FD\u8986\u76D6\u6846\u67B6\u5185\u90E8\u670D\u52A1\u540D\u3002",
2963
+ value: "",
2964
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2965
+ },
2966
+ {
2967
+ name: "HAI_DEPLOY_CONTAINER_COMPOSE_SERVICES_WEB",
2968
+ module: "deploy",
2969
+ path: "deploy.container.compose.services.web",
2970
+ description: "Web \u5BB9\u5668\u7684 Compose \u6269\u5C55\u3002",
2971
+ value: "",
2972
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2973
+ },
2974
+ {
2975
+ name: "HAI_DEPLOY_CONTAINER_COMPOSE_SERVICES_WEB_EXTRA_HOSTS",
2976
+ module: "deploy",
2977
+ path: "deploy.container.compose.services.web.extra_hosts",
2978
+ description: "\u5BB9\u5668\u5185\u7684\u4E3B\u673A\u540D\u5230 IPv4 \u6216 IPv6 \u5730\u5740\u6620\u5C04\uFF0C\u4E0D\u80FD\u8986\u76D6\u6846\u67B6\u5185\u90E8\u670D\u52A1\u540D\u3002",
2979
+ value: "",
2980
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
2981
+ },
2366
2982
  {
2367
2983
  name: "HAI_DEPLOY_CONTAINER_S3ENGINE",
2368
2984
  module: "deploy",
@@ -2419,6 +3035,78 @@ var cli_config_catalog_default = [
2419
3035
  value: "18080",
2420
3036
  constraint: "\u6574\u6570\uFF1B>= 1\uFF1B<= 65535"
2421
3037
  },
3038
+ {
3039
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS",
3040
+ module: "deploy",
3041
+ path: "deploy.provider.expose.https",
3042
+ description: "\u53EF\u9009 HTTPS \u5165\u53E3\uFF1Bfiles \u4F7F\u7528\u5DF2\u6709\u8BC1\u4E66\uFF0Cletsencrypt \u4F7F\u7528\u5B98\u65B9 Certbot \u7533\u8BF7\u7EED\u671F\uFF0C\u7701\u7565\u4FDD\u6301 HTTP",
3043
+ value: "",
3044
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
3045
+ },
3046
+ {
3047
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_ACCEPTTERMS",
3048
+ module: "deploy",
3049
+ path: "deploy.provider.expose.https.acceptTerms",
3050
+ description: "\u660E\u786E\u540C\u610F Let\u2019s Encrypt \u670D\u52A1\u6761\u6B3E\u540E\u624D\u53EF\u8BBE\u7F6E\u4E3A true",
3051
+ value: "true",
3052
+ constraint: "true\uFF1B\u53D6\u503C\uFF1Atrue"
3053
+ },
3054
+ {
3055
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_CERTIFICATEFILE",
3056
+ module: "deploy",
3057
+ path: "deploy.provider.expose.https.certificateFile",
3058
+ description: "PEM \u5B8C\u6574\u8BC1\u4E66\u94FE\u8DEF\u5F84\uFF0C\u76F8\u5BF9\u5DE5\u7A0B\u6839\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF1B\u6253\u5305\u65F6\u590D\u5236\u5230\u79C1\u6709\u53D1\u5E03\u76EE\u5F55",
3059
+ value: "",
3060
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
3061
+ },
3062
+ {
3063
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_DOMAIN",
3064
+ module: "deploy",
3065
+ path: "deploy.provider.expose.https.domain",
3066
+ description: "HTTPS \u516C\u5F00\u57DF\u540D\uFF1B\u8BC1\u4E66\u5FC5\u987B\u5339\u914D\u8BE5\u57DF\u540D",
3067
+ value: "",
3068
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5927\u5B57\u7B26\u6570 253\uFF1B\u6B63\u5219 ^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$"
3069
+ },
3070
+ {
3071
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_EMAIL",
3072
+ module: "deploy",
3073
+ path: "deploy.provider.expose.https.email",
3074
+ description: "Let\u2019s Encrypt \u8D26\u53F7\u8054\u7CFB\u90AE\u7BB1",
3075
+ value: "",
3076
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F email\uFF1B\u6B63\u5219 ^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
3077
+ },
3078
+ {
3079
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_PORT",
3080
+ module: "deploy",
3081
+ path: "deploy.provider.expose.https.port",
3082
+ description: "HTTPS \u5BBF\u4E3B\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 443\uFF0C\u987B\u4E0E HTTP \u7AEF\u53E3\u4E0D\u540C",
3083
+ value: "443",
3084
+ constraint: "\u6574\u6570\uFF1B>= 1\uFF1B<= 65535"
3085
+ },
3086
+ {
3087
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_PRIVATEKEYFILE",
3088
+ module: "deploy",
3089
+ path: "deploy.provider.expose.https.privateKeyFile",
3090
+ description: "\u672A\u52A0\u5BC6 PEM \u79C1\u94A5\u8DEF\u5F84\uFF0C\u76F8\u5BF9\u5DE5\u7A0B\u6839\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF1B\u5FC5\u987B\u4E0E\u8BC1\u4E66\u5339\u914D",
3091
+ value: "",
3092
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
3093
+ },
3094
+ {
3095
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_REDIRECTHTTP",
3096
+ module: "deploy",
3097
+ path: "deploy.provider.expose.https.redirectHttp",
3098
+ description: "\u666E\u901A HTTP \u8BF7\u6C42\u662F\u5426\u4EE5 308 \u8DF3\u8F6C\u81F3 HTTPS\uFF0C\u5065\u5EB7\u68C0\u67E5\u548C ACME \u6311\u6218\u9664\u5916",
3099
+ value: "true",
3100
+ constraint: "true | false"
3101
+ },
3102
+ {
3103
+ name: "HAI_DEPLOY_PROVIDER_EXPOSE_HTTPS_TYPE",
3104
+ module: "deploy",
3105
+ path: "deploy.provider.expose.https.type",
3106
+ description: "\u5E94\u7528\u90E8\u7F72\uFF1A\u5E73\u53F0/\u66B4\u9732\u65B9\u5F0F\uFF0C\u6309\u6240\u5728\u8282\u70B9\u7684\u679A\u4E3E\u9009\u62E9",
3107
+ value: "files",
3108
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Afiles | letsencrypt"
3109
+ },
2422
3110
  {
2423
3111
  name: "HAI_DEPLOY_PROVIDER_EXPOSE_TYPE",
2424
3112
  module: "deploy",
@@ -2787,6 +3475,14 @@ var cli_config_catalog_default = [
2787
3475
  value: "",
2788
3476
  constraint: "\u6709\u6548 HTTP(S) URL\uFF1B\u540C\u65F6\u51B3\u5B9A\u5BF9\u5E94\u9884\u89C8\u670D\u52A1\u7684\u76D1\u542C\u5730\u5740"
2789
3477
  },
3478
+ {
3479
+ name: "HAI_E2E_GROUP",
3480
+ module: "e2e",
3481
+ path: "HAI_E2E_GROUP",
3482
+ description: "\u73AF\u5883\u5165\u53E3\uFF1B\u4F7F\u7528\u4F4D\u7F6E packages/cli/templates/apps/fullstack/playwright.config.ts.hbs",
3483
+ value: "",
3484
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6309\u4F7F\u7528\u4F4D\u7F6E\u7684\u6821\u9A8C\u89C4\u5219\u586B\u5199"
3485
+ },
2790
3486
  {
2791
3487
  name: "HAI_E2E_LIVE",
2792
3488
  module: "e2e",
@@ -3977,7 +4673,7 @@ var cli_config_catalog_default = [
3977
4673
  path: "kit.access",
3978
4674
  description: "\u6BCF\u6B21\u8BF7\u6C42\u7684\u8DEF\u5F84/IP/\u65F6\u95F4\u7B56\u7565\uFF1Bfalse \u5173\u95ED\uFF0C\u5185\u8054\u89C4\u5219\u4E0E\u72EC\u7ACB YAML \u6587\u4EF6\u5F15\u7528\u4E0D\u80FD\u6DF7\u7528",
3979
4675
  value: "false",
3980
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
4676
+ constraint: "true | false\uFF1Bfalse\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
3981
4677
  },
3982
4678
  {
3983
4679
  name: "HAI_KIT_ACCESS_FILE",
@@ -4273,7 +4969,7 @@ var cli_config_catalog_default = [
4273
4969
  path: "kit.transport",
4274
4970
  description: "\u4F20\u8F93\u52A0\u5BC6\u5F00\u5173\u6216\u5BC6\u94A5\u534F\u5546\u914D\u7F6E",
4275
4971
  value: "false",
4276
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
4972
+ constraint: "false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
4277
4973
  },
4278
4974
  {
4279
4975
  name: "HAI_KIT_TRANSPORT_EXCLUDEPATHS",
@@ -4315,6 +5011,14 @@ var cli_config_catalog_default = [
4315
5011
  value: "/api/_hai/key-exchange",
4316
5012
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u4EE5 / \u5F00\u5934\u7684\u8DEF\u5F84\u5B57\u7B26\u4E32"
4317
5013
  },
5014
+ {
5015
+ name: "HAI_KIT_TRANSPORT_MAXFUTURESKEWSECONDS",
5016
+ module: "kit",
5017
+ path: "kit.transport.maxFutureSkewSeconds",
5018
+ description: "\u5141\u8BB8\u5BA2\u6237\u7AEF\u8BF7\u6C42\u65F6\u95F4\u9886\u5148\u670D\u52A1\u5668\u7684\u79D2\u6570",
5019
+ value: "30",
5020
+ constraint: "\u6574\u6570\uFF1B>= 0\uFF1B<= 300"
5021
+ },
4318
5022
  {
4319
5023
  name: "HAI_KIT_TRANSPORT_MAXPLAINTEXTBYTES",
4320
5024
  module: "kit",
@@ -4323,6 +5027,14 @@ var cli_config_catalog_default = [
4323
5027
  value: "auto",
4324
5028
  constraint: "\u6574\u6570\uFF1B>= 1024\uFF1B<= 67108864\uFF1B\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aauto"
4325
5029
  },
5030
+ {
5031
+ name: "HAI_KIT_TRANSPORT_MAXREQUESTAGESECONDS",
5032
+ module: "kit",
5033
+ path: "kit.transport.maxRequestAgeSeconds",
5034
+ description: "\u8BF7\u6C42\u4ECE\u7B7E\u53D1\u8D77\u7684\u6709\u6548\u79D2\u6570",
5035
+ value: "300",
5036
+ constraint: "\u6574\u6570\uFF1B>= 1\uFF1B<= 600"
5037
+ },
4326
5038
  {
4327
5039
  name: "HAI_KIT_TRANSPORT_ROUTEPLAINTEXTBYTES",
4328
5040
  module: "kit",
@@ -4687,7 +5399,7 @@ var cli_config_catalog_default = [
4687
5399
  name: "HAI_REACH_PROVIDERS_0_ENDPOINT",
4688
5400
  module: "reach",
4689
5401
  path: "reach.providers.0.endpoint",
4690
- description: "API \u7AEF\u70B9\uFF08\u9ED8\u8BA4 dysmsapi.aliyuncs.com\uFF09",
5402
+ description: "\u76F4\u8FDE API \u7AEF\u70B9\uFF08\u9ED8\u8BA4 dysmsapi.aliyuncs.com\uFF09\uFF1B\u914D\u7F6E\u7F51\u5173\u65F6\u4F7F\u7528\u7F51\u5173 URL\u3002",
4691
5403
  value: "dysmsapi.aliyuncs.com",
4692
5404
  constraint: "\u5B57\u7B26\u4E32"
4693
5405
  },
@@ -4700,20 +5412,52 @@ var cli_config_catalog_default = [
4700
5412
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
4701
5413
  },
4702
5414
  {
4703
- name: "HAI_REACH_PROVIDERS_0_HEADERS",
5415
+ name: "HAI_REACH_PROVIDERS_0_GATEWAY",
4704
5416
  module: "reach",
4705
- path: "reach.providers.0.headers",
4706
- description: "\u81EA\u5B9A\u4E49\u8BF7\u6C42\u5934",
5417
+ path: "reach.providers.0.gateway",
5418
+ description: "\u53EF\u9009\u7684\u77ED\u4FE1\u9694\u79BB\u7F51\u5173\uFF0C\u4EE5 POST \u8BF7\u6C42\u8F6C\u53D1\u5DF2\u7B7E\u540D\u7684\u67E5\u8BE2\u53C2\u6570\u3002",
5419
+ value: "",
5420
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
5421
+ },
5422
+ {
5423
+ name: "HAI_REACH_PROVIDERS_0_GATEWAY_ALLOWINSECUREHTTP",
5424
+ module: "reach",
5425
+ path: "reach.providers.0.gateway.allowInsecureHttp",
5426
+ description: "\u4EC5\u5728\u53D7\u4FE1\u5185\u7F51\u663E\u5F0F\u5141\u8BB8\u660E\u6587 HTTP\u3002",
5427
+ value: "false",
5428
+ constraint: "true | false"
5429
+ },
5430
+ {
5431
+ name: "HAI_REACH_PROVIDERS_0_GATEWAY_BODY",
5432
+ module: "reach",
5433
+ path: "reach.providers.0.gateway.body",
5434
+ description: "\u7F51\u5173\u8BF7\u6C42\u4F53\uFF1B\u5BF9\u8C61\u548C\u6570\u7EC4\u5E8F\u5217\u5316\u4E3A JSON\uFF0C\u5B57\u7B26\u4E32\u539F\u6837\u53D1\u9001\u3002\u7701\u7565\u65F6\u4E0D\u53D1\u8BF7\u6C42\u4F53\u3002",
5435
+ value: "",
5436
+ constraint: "JSON \u5BF9\u8C61\u3001\u6570\u7EC4\u6216\u539F\u59CB\u6587\u672C"
5437
+ },
5438
+ {
5439
+ name: "HAI_REACH_PROVIDERS_0_GATEWAY_HEADERS",
5440
+ module: "reach",
5441
+ path: "reach.providers.0.gateway.headers",
5442
+ description: "\u7F51\u5173\u81EA\u5B9A\u4E49\u8BF7\u6C42\u5934\uFF1B\u8FDE\u63A5\u4E0E\u6D88\u606F\u957F\u5EA6\u76F8\u5173\u7684\u5934\u7531 HTTP \u5BA2\u6237\u7AEF\u7BA1\u7406\u3002",
4707
5443
  value: "",
4708
5444
  constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
4709
5445
  },
4710
5446
  {
4711
- name: "HAI_REACH_PROVIDERS_0_HEADERS_AUTHORIZATION",
5447
+ name: "HAI_REACH_PROVIDERS_0_GATEWAY_URL",
5448
+ module: "reach",
5449
+ path: "reach.providers.0.gateway.url",
5450
+ description: "\u7F51\u5173\u7684\u5B8C\u6574 HTTP(S) URL\uFF1B\u5305\u542B\u8DEF\u5F84\uFF0C\u4E0D\u5141\u8BB8\u51ED\u636E\u3001\u67E5\u8BE2\u53C2\u6570\u6216\u7247\u6BB5\u3002",
5451
+ value: "",
5452
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F uri"
5453
+ },
5454
+ {
5455
+ name: "HAI_REACH_PROVIDERS_0_HEADERS",
4712
5456
  module: "reach",
4713
- path: "HAI_REACH_PROVIDERS_0_HEADERS_AUTHORIZATION",
4714
- description: "API \u901A\u77E5 Provider \u7684\u5B8C\u6574 Authorization \u8BF7\u6C42\u5934",
5457
+ path: "reach.providers.0.headers",
5458
+ description: "\u81EA\u5B9A\u4E49\u8BF7\u6C42\u5934",
4715
5459
  value: "",
4716
- constraint: "\u654F\u611F\u5B57\u7B26\u4E32\uFF0C\u5305\u542B\u8BA4\u8BC1\u65B9\u6848\u53CA\u51ED\u636E\uFF0C\u4F8B\u5982 Bearer <token>"
5460
+ constraint: "JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9"
4717
5461
  },
4718
5462
  {
4719
5463
  name: "HAI_REACH_PROVIDERS_0_HOST",
@@ -4827,6 +5571,22 @@ var cli_config_catalog_default = [
4827
5571
  value: "",
4828
5572
  constraint: "\u5B57\u7B26\u4E32"
4829
5573
  },
5574
+ {
5575
+ name: "HAI_REACH_PROVIDERS_1_ACCESSKEYID",
5576
+ module: "reach",
5577
+ path: "HAI_REACH_PROVIDERS_1_ACCESSKEYID",
5578
+ description: "\u963F\u91CC\u4E91 AccessKey ID",
5579
+ value: "",
5580
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
5581
+ },
5582
+ {
5583
+ name: "HAI_REACH_PROVIDERS_1_ACCESSKEYSECRET",
5584
+ module: "reach",
5585
+ path: "HAI_REACH_PROVIDERS_1_ACCESSKEYSECRET",
5586
+ description: "\u963F\u91CC\u4E91 AccessKey Secret",
5587
+ value: "",
5588
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6700\u5C0F\u5B57\u7B26\u6570 1"
5589
+ },
4830
5590
  {
4831
5591
  name: "HAI_REACH_PROVIDERS_1_TYPE",
4832
5592
  module: "reach",
@@ -4835,6 +5595,22 @@ var cli_config_catalog_default = [
4835
5595
  value: "console",
4836
5596
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aconsole | smtp | aliyun-sms | api"
4837
5597
  },
5598
+ {
5599
+ name: "HAI_REACH_PROVIDERS_2_HEADERS_AUTHORIZATION",
5600
+ module: "reach",
5601
+ path: "HAI_REACH_PROVIDERS_2_HEADERS_AUTHORIZATION",
5602
+ description: "\u51ED\u636E\u8F93\u5165\uFF1B\u4F7F\u7528\u4F4D\u7F6E packages/cli/src/commands/cli-config-templates.ts",
5603
+ value: "",
5604
+ constraint: "\u654F\u611F\u5B57\u7B26\u4E32\uFF1B\u542F\u7528\u76F8\u5E94\u529F\u80FD\u65F6\u5FC5\u586B\uFF0C\u4E0D\u5F97\u63D0\u4EA4\u771F\u5B9E\u503C"
5605
+ },
5606
+ {
5607
+ name: "HAI_REACH_PROVIDERS_2_IDEMPOTENT",
5608
+ module: "reach",
5609
+ path: "HAI_REACH_PROVIDERS_2_IDEMPOTENT",
5610
+ description: "\u63A5\u6536\u7AEF\u6309 Idempotency-Key \u539F\u5B50\u6301\u4E45\u53BB\u91CD\uFF0C\u4E14\u8986\u76D6\u6240\u6709\u91CD\u8BD5\u4E0E\u65E7\u8282\u70B9\u8FDF\u5230\u8BF7\u6C42\u65F6\u624D\u542F\u7528\uFF1B\u9ED8\u8BA4 false\u3002",
5611
+ value: "false",
5612
+ constraint: "true | false"
5613
+ },
4838
5614
  {
4839
5615
  name: "HAI_REACH_QUEUE",
4840
5616
  module: "reach",
@@ -4847,7 +5623,7 @@ var cli_config_catalog_default = [
4847
5623
  name: "HAI_REACH_QUEUE_MAXATTEMPTS",
4848
5624
  module: "reach",
4849
5625
  path: "reach.queue.maxAttempts",
4850
- description: "\u81EA\u52A8\u9886\u53D6\u6B21\u6570\u4E0A\u9650\uFF08\u542B\u9996\u6B21\u53CA\u5D29\u6E83\u6062\u590D\uFF0C\u9ED8\u8BA4 5\uFF0C\u8303\u56F4 1\u2013100\uFF09\u3002",
5626
+ description: "\u6BCF\u6761\u961F\u5217\u6D88\u606F\u6700\u591A\u5904\u7406\u591A\u5C11\u6B21\uFF0C\u5305\u542B\u9996\u6B21\u53D1\u9001\u3001\u5931\u8D25\u91CD\u8BD5\u548C\u5F02\u5E38\u9000\u51FA\u540E\u7684\u91CD\u65B0\u5904\u7406\uFF1B\u9ED8\u8BA4 5\uFF0C\u8303\u56F4 1\u2013100\u3002",
4851
5627
  value: "5",
4852
5628
  constraint: "\u6574\u6570\uFF1B>= 1\uFF1B<= 100"
4853
5629
  },
@@ -4855,7 +5631,7 @@ var cli_config_catalog_default = [
4855
5631
  name: "HAI_REACH_QUEUE_MAXRETRYDELAYMS",
4856
5632
  module: "reach",
4857
5633
  path: "reach.queue.maxRetryDelayMs",
4858
- description: "\u6307\u6570\u9000\u907F\u4E0A\u9650\u6BEB\u79D2\u6570\uFF0C\u4E0D\u5F97\u5C0F\u4E8E retryDelayMs\uFF08\u9ED8\u8BA4 3600000\uFF09\u3002",
5634
+ description: "\u540E\u7EED\u5931\u8D25\u65F6\u7B49\u5F85\u65F6\u95F4\u9010\u6B21\u52A0\u500D\uFF0C\u4F46\u4E0D\u8D85\u8FC7\u6B64\u503C\uFF1B\u9ED8\u8BA4 3600000\uFF081 \u5C0F\u65F6\uFF09\uFF0C\u4E0D\u5F97\u5C0F\u4E8E retryDelayMs\u3002",
4859
5635
  value: "3600000",
4860
5636
  constraint: "\u6574\u6570\uFF1B>= 1000\uFF1B<= 86400000"
4861
5637
  },
@@ -4863,7 +5639,7 @@ var cli_config_catalog_default = [
4863
5639
  name: "HAI_REACH_QUEUE_RETRYDELAYMS",
4864
5640
  module: "reach",
4865
5641
  path: "reach.queue.retryDelayMs",
4866
- description: "\u9996\u6B21\u5931\u8D25\u540E\u7684\u9000\u907F\u6BEB\u79D2\u6570\uFF08\u9ED8\u8BA4 60000\uFF0C\u8303\u56F4 1000\u201386400000\uFF09\u3002",
5642
+ description: "\u7B2C\u4E00\u6B21\u53D1\u9001\u5931\u8D25\u540E\uFF0C\u7B49\u5F85\u591A\u5C11\u6BEB\u79D2\u518D\u8BD5\uFF1B\u9ED8\u8BA4 60000\uFF081 \u5206\u949F\uFF09\uFF0C\u8303\u56F4 1000\u201386400000\u3002",
4867
5643
  value: "60000",
4868
5644
  constraint: "\u6574\u6570\uFF1B>= 1000\uFF1B<= 86400000"
4869
5645
  },
@@ -4923,6 +5699,14 @@ var cli_config_catalog_default = [
4923
5699
  value: "",
4924
5700
  constraint: "\u672C\u673A HTTP(S) URL\uFF1B\u76F4\u63A5\u8FD0\u884C\u65F6 BASE_URL \u4F18\u5148"
4925
5701
  },
5702
+ {
5703
+ name: "ALL_PROXY",
5704
+ module: "runtime",
5705
+ path: "ALL_PROXY",
5706
+ description: "\u6784\u5EFA\u4E0B\u8F7D\u7684\u5176\u4ED6\u4EE3\u7406\u5165\u53E3\uFF1B\u4EC5 inherit \u6A21\u5F0F\u539F\u6837\u4F20\u9012\uFF0C\u5176\u4ED6\u6A21\u5F0F\u6E05\u7A7A",
5707
+ value: "",
5708
+ constraint: "\u4EE3\u7406 URL\uFF1B\u534F\u8BAE\u652F\u6301\u7531\u4E0B\u8F7D\u5DE5\u5177\u51B3\u5B9A\uFF1B\u5C0F\u5199 all_proxy \u4E5F\u53D7\u652F\u6301"
5709
+ },
4926
5710
  {
4927
5711
  name: "ANTHROPIC_API_KEY",
4928
5712
  module: "runtime",
@@ -4963,6 +5747,14 @@ var cli_config_catalog_default = [
4963
5747
  value: "",
4964
5748
  constraint: "\u6709\u6548 HTTP(S) URL\uFF1B\u53D1\u5E03\u539F\u751F\u5305\u65F6\u4E0D\u8BBE\u7F6E"
4965
5749
  },
5750
+ {
5751
+ name: "CARGO_TARGET_DIR",
5752
+ module: "runtime",
5753
+ path: "CARGO_TARGET_DIR",
5754
+ description: "\u73AF\u5883\u5165\u53E3\uFF1B\u4F7F\u7528\u4F4D\u7F6E packages/cli/src/commands/cli-build.ts",
5755
+ value: "",
5756
+ constraint: "\u5B57\u7B26\u4E32\uFF1B\u6309\u4F7F\u7528\u4F4D\u7F6E\u7684\u6821\u9A8C\u89C4\u5219\u586B\u5199"
5757
+ },
4966
5758
  {
4967
5759
  name: "CI",
4968
5760
  module: "runtime",
@@ -5051,6 +5843,14 @@ var cli_config_catalog_default = [
5051
5843
  value: "",
5052
5844
  constraint: "\u6574\u6570 1\u201365535"
5053
5845
  },
5846
+ {
5847
+ name: "FTP_PROXY",
5848
+ module: "runtime",
5849
+ path: "FTP_PROXY",
5850
+ description: "\u6784\u5EFA\u4E0B\u8F7D\u7684 FTP \u4EE3\u7406\u5165\u53E3\uFF1B\u4EC5 inherit \u6A21\u5F0F\u539F\u6837\u4F20\u9012\uFF0C\u5176\u4ED6\u6A21\u5F0F\u6E05\u7A7A",
5851
+ value: "",
5852
+ constraint: "\u4EE3\u7406 URL\uFF1B\u534F\u8BAE\u652F\u6301\u7531\u4E0B\u8F7D\u5DE5\u5177\u51B3\u5B9A\uFF1B\u5C0F\u5199 ftp_proxy \u4E5F\u53D7\u652F\u6301"
5853
+ },
5054
5854
  {
5055
5855
  name: "GEMINI_API_KEY",
5056
5856
  module: "runtime",
@@ -5131,6 +5931,22 @@ var cli_config_catalog_default = [
5131
5931
  value: "",
5132
5932
  constraint: "JSON \u5BF9\u8C61 {activeKeyId,keys:{id:{publicKey,privateKey}}}\uFF1B\u6240\u6709\u8282\u70B9\u5171\u4EAB\uFF0CID \u4E3A 1-64 \u4E2A\u5B57\u6BCD/\u6570\u5B57/\u4E0B\u5212\u7EBF/\u8FDE\u5B57\u7B26\uFF1B\u7981\u6B62 PUBLIC_/VITE_/\u516C\u5F00 YAML/\u65E5\u5FD7"
5133
5933
  },
5934
+ {
5935
+ name: "HAI_NGINX_IMAGE",
5936
+ module: "runtime",
5937
+ path: "HAI_NGINX_IMAGE",
5938
+ description: "Dockerfile \u7684 Nginx \u57FA\u7840\u955C\u50CF\u6784\u5EFA\u53C2\u6570\uFF0C\u7531 CLI \u6309 build.sources.image \u6216 --image-source \u6CE8\u5165",
5939
+ value: "",
5940
+ constraint: "OCI \u955C\u50CF\u5F15\u7528\uFF1B\u4E0D\u662F\u5E94\u7528 .env \u914D\u7F6E\u9879"
5941
+ },
5942
+ {
5943
+ name: "HAI_NODE_IMAGE",
5944
+ module: "runtime",
5945
+ path: "HAI_NODE_IMAGE",
5946
+ description: "Dockerfile \u7684 Node \u57FA\u7840\u955C\u50CF\u6784\u5EFA\u53C2\u6570\uFF0C\u7531 CLI \u6309 build.sources.image \u6216 --image-source \u6CE8\u5165",
5947
+ value: "",
5948
+ constraint: "OCI \u955C\u50CF\u5F15\u7528\uFF1B\u4E0D\u662F\u5E94\u7528 .env \u914D\u7F6E\u9879"
5949
+ },
5134
5950
  {
5135
5951
  name: "HF_ENDPOINT",
5136
5952
  module: "runtime",
@@ -5155,6 +5971,22 @@ var cli_config_catalog_default = [
5155
5971
  value: "0.0.0.0",
5156
5972
  constraint: "\u4E3B\u673A\u540D\u6216 IP"
5157
5973
  },
5974
+ {
5975
+ name: "HTTP_PROXY",
5976
+ module: "runtime",
5977
+ path: "HTTP_PROXY",
5978
+ description: "\u6784\u5EFA\u4E0B\u8F7D\u7684 HTTP \u4EE3\u7406\uFF1Binherit \u6A21\u5F0F\u7EE7\u627F\u8FDB\u7A0B\u73AF\u5883\uFF0Csystem/custom/none \u6A21\u5F0F\u7531 CLI \u8986\u76D6",
5979
+ value: "",
5980
+ constraint: "HTTP(S) \u4EE3\u7406 URL\uFF1B\u5C0F\u5199 http_proxy \u4E5F\u53D7\u652F\u6301\uFF1B\u955C\u50CF\u62C9\u53D6\u4ECD\u53D6\u51B3\u4E8E\u5F15\u64CE\u4EE3\u7406"
5981
+ },
5982
+ {
5983
+ name: "HTTPS_PROXY",
5984
+ module: "runtime",
5985
+ path: "HTTPS_PROXY",
5986
+ description: "\u6784\u5EFA\u4E0B\u8F7D\u7684 HTTPS \u4EE3\u7406\uFF1B\u672A\u63D0\u4F9B\u65F6\u56DE\u9000 HTTP_PROXY\uFF1Bsystem/custom/none \u6A21\u5F0F\u7531 CLI \u8986\u76D6",
5987
+ value: "",
5988
+ constraint: "HTTP(S) \u4EE3\u7406 URL\uFF1B\u5C0F\u5199 https_proxy \u4E5F\u53D7\u652F\u6301\uFF1B\u955C\u50CF\u62C9\u53D6\u4ECD\u53D6\u51B3\u4E8E\u5F15\u64CE\u4EE3\u7406"
5989
+ },
5158
5990
  {
5159
5991
  name: "IAM_FIXTURE_LDAP",
5160
5992
  module: "runtime",
@@ -5235,6 +6067,14 @@ var cli_config_catalog_default = [
5235
6067
  value: "/opt/models",
5236
6068
  constraint: "\u53EF\u8BFB\u53D6\u7684\u6A21\u578B\u8DEF\u5F84\u6216\u6709\u6548\u4ED3\u5E93 ID\uFF1B\u9ED8\u8BA4 /opt/models"
5237
6069
  },
6070
+ {
6071
+ name: "NO_PROXY",
6072
+ module: "runtime",
6073
+ path: "NO_PROXY",
6074
+ description: "\u6784\u5EFA\u4E0B\u8F7D\u7684\u4EE3\u7406\u7ED5\u8FC7\u5217\u8868\uFF1Binherit \u6A21\u5F0F\u7EE7\u627F\uFF0C\u53EF\u7531 build.proxy.bypass \u6216 --proxy-bypass \u8986\u76D6",
6075
+ value: "",
6076
+ constraint: "\u9017\u53F7\u5206\u9694\u7684\u4E3B\u673A\u6216\u5730\u5740\uFF1B\u5C0F\u5199 no_proxy \u4E5F\u53D7\u652F\u6301\uFF1Bnone \u6A21\u5F0F\u6E05\u7A7A"
6077
+ },
5238
6078
  {
5239
6079
  name: "NODE_ENV",
5240
6080
  module: "runtime",
@@ -5433,7 +6273,7 @@ var cli_config_catalog_default = [
5433
6273
  path: "scheduler.enableDb",
5434
6274
  description: "\u5FC5\u987B\u4F7F\u7528\u5171\u4EAB\u6570\u636E\u5E93\u4FDD\u5B58\u6267\u884C\u72B6\u6001\uFF1Bfalse \u4E0D\u518D\u5141\u8BB8\uFF0C\u9700\u8981\u5148\u521D\u59CB\u5316",
5435
6275
  value: "true",
5436
- constraint: "true | false\uFF1B\u53D6\u503C\uFF1Atrue"
6276
+ constraint: "true\uFF1B\u53D6\u503C\uFF1Atrue"
5437
6277
  },
5438
6278
  {
5439
6279
  name: "HAI_SCHEDULER_LEASEMS",
@@ -5616,7 +6456,7 @@ var cli_config_catalog_default = [
5616
6456
  module: "serv",
5617
6457
  path: "serv.cors.nativeOrigins",
5618
6458
  description: "\u5141\u8BB8\u4F7F\u7528\u539F\u751F\u51ED\u636E\u901A\u9053\u7684\u5B8C\u6574 Origin \u5217\u8868",
5619
- value: "http://localhost,https://tauri.localhost,tauri://localhost,capacitor://localhost",
6459
+ value: "http://localhost,https://localhost,http://tauri.localhost,https://tauri.localhost,tauri://localhost,capacitor://localhost",
5620
6460
  constraint: "\u5B57\u7B26\u4E32"
5621
6461
  },
5622
6462
  {
@@ -5641,7 +6481,7 @@ var cli_config_catalog_default = [
5641
6481
  path: "serv.http.access",
5642
6482
  description: "\u6BCF\u6B21\u8BF7\u6C42\u7684\u8DEF\u5F84/IP/\u65F6\u95F4\u7B56\u7565\uFF1Bfalse \u5173\u95ED\uFF0C\u5185\u8054\u89C4\u5219\u4E0E\u72EC\u7ACB YAML \u6587\u4EF6\u5F15\u7528\u4E0D\u80FD\u6DF7\u7528",
5643
6483
  value: "false",
5644
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
6484
+ constraint: "true | false\uFF1Bfalse\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
5645
6485
  },
5646
6486
  {
5647
6487
  name: "HAI_SERV_HTTP_ACCESS_FILE",
@@ -5913,7 +6753,7 @@ var cli_config_catalog_default = [
5913
6753
  path: "serv.http.docs",
5914
6754
  description: "HTTP API \u6587\u6863\u529F\u80FD\u5F00\u5173\u6216\u6587\u6863\u8BBF\u95EE\u914D\u7F6E",
5915
6755
  value: "false",
5916
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
6756
+ constraint: "true | false\uFF1Bfalse\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
5917
6757
  },
5918
6758
  {
5919
6759
  name: "HAI_SERV_HTTP_DOCS_PATH",
@@ -5937,7 +6777,7 @@ var cli_config_catalog_default = [
5937
6777
  path: "serv.http.health",
5938
6778
  description: "HTTP \u5065\u5EB7\u68C0\u67E5\u5F00\u5173\u6216\u68C0\u67E5\u914D\u7F6E",
5939
6779
  value: '{"path":"/health","readyPath":"/ready"}',
5940
- constraint: "JSON \u5BF9\u8C61\uFF1Btrue | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
6780
+ constraint: "JSON \u5BF9\u8C61\uFF1Bfalse\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
5941
6781
  },
5942
6782
  {
5943
6783
  name: "HAI_SERV_HTTP_HEALTH_PATH",
@@ -5961,7 +6801,7 @@ var cli_config_catalog_default = [
5961
6801
  path: "serv.http.openapi",
5962
6802
  description: "OpenAPI \u7AEF\u70B9\u5F00\u5173\u6216\u7AEF\u70B9\u914D\u7F6E",
5963
6803
  value: "false",
5964
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
6804
+ constraint: "true | false\uFF1Bfalse\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
5965
6805
  },
5966
6806
  {
5967
6807
  name: "HAI_SERV_HTTP_OPENAPI_PATH",
@@ -5971,46 +6811,6 @@ var cli_config_catalog_default = [
5971
6811
  value: "/openapi.json",
5972
6812
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u4EE5 / \u5F00\u5934\u7684\u8DEF\u5F84\u5B57\u7B26\u4E32"
5973
6813
  },
5974
- {
5975
- name: "HAI_SERV_HTTP_RPC",
5976
- module: "serv",
5977
- path: "serv.http.rpc",
5978
- description: "RPC \u7AEF\u70B9\u5F00\u5173\u6216\u8BBF\u95EE\u914D\u7F6E",
5979
- value: "false",
5980
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
5981
- },
5982
- {
5983
- name: "HAI_SERV_HTTP_RPC_ACCESS",
5984
- module: "serv",
5985
- path: "serv.http.rpc.access",
5986
- description: "RPC \u5BF9\u5916\u8BBF\u95EE\u7B56\u7565",
5987
- value: "loopback",
5988
- constraint: "\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aloopback | private-network | gateway-only"
5989
- },
5990
- {
5991
- name: "HAI_SERV_HTTP_RPC_GATEWAYHEADER",
5992
- module: "serv",
5993
- path: "serv.http.rpc.gatewayHeader",
5994
- description: "\u53D7\u4FE1\u7F51\u5173\u8BA4\u8BC1\u8BF7\u6C42\u5934\u540D\u79F0",
5995
- value: "",
5996
- constraint: "\u5B57\u7B26\u4E32"
5997
- },
5998
- {
5999
- name: "HAI_SERV_HTTP_RPC_GATEWAYSECRET",
6000
- module: "serv",
6001
- path: "serv.http.rpc.gatewaySecret",
6002
- description: "\u53D7\u4FE1\u7F51\u5173\u8BA4\u8BC1\u5BC6\u94A5",
6003
- value: "",
6004
- constraint: "\u5B57\u7B26\u4E32"
6005
- },
6006
- {
6007
- name: "HAI_SERV_HTTP_RPC_PREFIX",
6008
- module: "serv",
6009
- path: "serv.http.rpc.prefix",
6010
- description: "RPC \u7AEF\u70B9\u7684\u8DEF\u5F84\u524D\u7F00",
6011
- value: "/rpc",
6012
- constraint: "\u5B57\u7B26\u4E32\uFF1B\u4EE5 / \u5F00\u5934\u7684\u8DEF\u5F84\u5B57\u7B26\u4E32"
6013
- },
6014
6814
  {
6015
6815
  name: "HAI_SERV_HTTP_TRUSTEDPROXIES",
6016
6816
  module: "serv",
@@ -6027,6 +6827,14 @@ var cli_config_catalog_default = [
6027
6827
  value: "",
6028
6828
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u683C\u5F0F ipv4\uFF1B\u6B63\u5219 ^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$\uFF1B\u683C\u5F0F ipv6\uFF1B\u6B63\u5219 ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$\uFF1B\u683C\u5F0F cidrv4\uFF1B\u6B63\u5219 ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$\uFF1B\u683C\u5F0F cidrv6\uFF1B\u6B63\u5219 ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"
6029
6829
  },
6830
+ {
6831
+ name: "HAI_SERV_REFRESH_COOKIE_SECURE",
6832
+ module: "serv",
6833
+ path: "HAI_SERV_REFRESH_COOKIE_SECURE",
6834
+ description: "Serv \u5237\u65B0 Cookie \u7684 Secure \u5C5E\u6027\uFF1B\u7559\u7A7A\u6CBF\u7528\u73AF\u5883\u9ED8\u8BA4\u503C\uFF0C\u751F\u4EA7\u9ED8\u8BA4\u5F00\u542F",
6835
+ value: "",
6836
+ constraint: "true | false\uFF1B\u4EC5\u5728\u53D7\u63A7\u5185\u7F51\u6216 VPN \u7684 HTTP \u5165\u53E3\u4F7F\u7528 false"
6837
+ },
6030
6838
  {
6031
6839
  name: "HAI_SERV_SERVER",
6032
6840
  module: "serv",
@@ -6057,7 +6865,7 @@ var cli_config_catalog_default = [
6057
6865
  path: "serv.transport",
6058
6866
  description: "\u4F20\u8F93\u52A0\u5BC6\u5F00\u5173\u6216\u5BC6\u94A5\u534F\u5546\u914D\u7F6E",
6059
6867
  value: "false",
6060
- constraint: "true | false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
6868
+ constraint: "false\uFF1BJSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9\uFF1B\u53D6\u503C\uFF1Afalse"
6061
6869
  },
6062
6870
  {
6063
6871
  name: "HAI_SERV_TRANSPORT_EXCLUDEPATHS",
@@ -6115,6 +6923,14 @@ var cli_config_catalog_default = [
6115
6923
  value: "/_hai/key-exchange",
6116
6924
  constraint: "\u5B57\u7B26\u4E32\uFF1B\u4EE5 / \u5F00\u5934\u7684\u8DEF\u5F84\u5B57\u7B26\u4E32"
6117
6925
  },
6926
+ {
6927
+ name: "HAI_SERV_TRANSPORT_MAXFUTURESKEWSECONDS",
6928
+ module: "serv",
6929
+ path: "serv.transport.maxFutureSkewSeconds",
6930
+ description: "\u5141\u8BB8\u5BA2\u6237\u7AEF\u8BF7\u6C42\u65F6\u95F4\u9886\u5148\u670D\u52A1\u5668\u7684\u79D2\u6570",
6931
+ value: "30",
6932
+ constraint: "\u6574\u6570\uFF1B>= 0\uFF1B<= 300"
6933
+ },
6118
6934
  {
6119
6935
  name: "HAI_SERV_TRANSPORT_MAXPLAINTEXTBYTES",
6120
6936
  module: "serv",
@@ -6123,6 +6939,14 @@ var cli_config_catalog_default = [
6123
6939
  value: "1048576",
6124
6940
  constraint: "\u6574\u6570\uFF1B>= 1024\uFF1B<= 67108864\uFF1B\u5B57\u7B26\u4E32\uFF1B\u53D6\u503C\uFF1Aauto"
6125
6941
  },
6942
+ {
6943
+ name: "HAI_SERV_TRANSPORT_MAXREQUESTAGESECONDS",
6944
+ module: "serv",
6945
+ path: "serv.transport.maxRequestAgeSeconds",
6946
+ description: "\u8BF7\u6C42\u4ECE\u7B7E\u53D1\u8D77\u7684\u6709\u6548\u79D2\u6570",
6947
+ value: "300",
6948
+ constraint: "\u6574\u6570\uFF1B>= 1\uFF1B<= 600"
6949
+ },
6126
6950
  {
6127
6951
  name: "HAI_SERV_TRANSPORT_ROUTEPLAINTEXTBYTES",
6128
6952
  module: "serv",
@@ -6239,7 +7063,7 @@ var cli_config_catalog_default = [
6239
7063
  name: "HAI_STORAGE_PREFIX",
6240
7064
  module: "storage",
6241
7065
  path: "storage.prefix",
6242
- description: "\u8DEF\u5F84\u524D\u7F00\uFF08\u6240\u6709\u64CD\u4F5C\u90FD\u4F1A\u52A0\u4E0A\u6B64\u524D\u7F00\uFF09",
7066
+ description: "S3 \u6876\u5185\u5BF9\u8C61\u952E\u524D\u7F00\uFF0C\u4F8B\u5982 my-app/uploads/\uFF0C\u7559\u7A7A\u4F7F\u7528\u6876\u6839",
6243
7067
  value: "",
6244
7068
  constraint: "\u5B57\u7B26\u4E32"
6245
7069
  },
@@ -6472,7 +7296,55 @@ var cli_config_catalog_default = [
6472
7296
  // src/commands/cli-config-environment.ts
6473
7297
  var catalogByName = new Map(cli_config_catalog_default.map((entry) => [entry.name, entry]));
6474
7298
  var catalogByPath = new Map(cli_config_catalog_default.map((entry) => [entry.path, entry]));
7299
+ function configurationConstraint(value) {
7300
+ return value.replaceAll("JSON \u5BF9\u8C61\uFF1B\u6574\u4F53\u8986\u76D6\u65F6\u66FF\u6362\u8BE5\u8282\u70B9", "\u914D\u7F6E\u5757\uFF08\u586B\u5199\u4E0B\u65B9\u7F29\u8FDB\u5B57\u6BB5\uFF09").replaceAll("JSON \u6570\u7EC4\uFF1B\u7D22\u5F15\u53EF\u6309 0\u30011\u30012 \u6269\u5C55", "\u5217\u8868\uFF08\u6BCF\u9879\u4EE5 - \u5F00\u5934\uFF09").replaceAll("string,null", "\u5B57\u7B26\u4E32\u6216\u7A7A\u503C").replaceAll("\uFF1B<= 9007199254740991", "");
7301
+ }
7302
+ function withoutGeneratedDocumentation(content) {
7303
+ const { lines, document: optional, counter } = readOptionalConfig(content);
7304
+ const starts = [];
7305
+ let offset = 0;
7306
+ for (const line of lines) {
7307
+ starts.push(offset);
7308
+ offset += line.length + 1;
7309
+ }
7310
+ const ranges = [];
7311
+ function originalOffset(position, end) {
7312
+ const location = counter.linePos(position);
7313
+ const line = lines[location.line - 1] ?? "";
7314
+ const prefix = /^(\s*)# (?=\s*(?:[a-z][\w-]*:|-\s))/i.exec(line);
7315
+ const column = location.col - 1;
7316
+ const removed = prefix && (column > prefix[1].length || !end && column === prefix[1].length) ? 2 : 0;
7317
+ return (starts[location.line - 1] ?? content.length) + column + removed;
7318
+ }
7319
+ function collect(node, virtual) {
7320
+ if (isMap(node)) {
7321
+ for (const pair of node.items)
7322
+ collect(pair.value, virtual);
7323
+ } else if (isSeq(node)) {
7324
+ node.items.forEach((item) => collect(item, virtual));
7325
+ } else if (isScalar(node) && node.range) {
7326
+ ranges.push(virtual ? [
7327
+ originalOffset(node.range[0], false),
7328
+ originalOffset(node.range[1], true)
7329
+ ] : [node.range[0], node.range[1]]);
7330
+ }
7331
+ }
7332
+ collect(parseDocument(content).contents, false);
7333
+ if (!optional.errors.length)
7334
+ collect(optional.contents, true);
7335
+ const protectedAt = (position) => ranges.some(([start, end]) => position >= start && position < end);
7336
+ return lines.flatMap((line, index) => {
7337
+ const metadata = /^(\s*)#\s*(?:用途|说明|取值):/.exec(line);
7338
+ if (metadata && !protectedAt(starts[index] + metadata[1].length))
7339
+ return [];
7340
+ const suffix = line.lastIndexOf(" # \u8BF4\u660E\uFF1A");
7341
+ return [
7342
+ suffix >= 0 && !protectedAt(starts[index] + suffix + 1) ? line.slice(0, suffix) : line
7343
+ ];
7344
+ }).join("\n");
7345
+ }
6475
7346
  function documentConfig(name, content) {
7347
+ content = withoutGeneratedDocumentation(content);
6476
7348
  const document = parseDocument(content);
6477
7349
  if (document.errors.length)
6478
7350
  throw new Error(`Invalid ${name} configuration documentation source`);
@@ -6483,7 +7355,7 @@ function documentConfig(name, content) {
6483
7355
  const previous = node[field];
6484
7356
  if (!previous)
6485
7357
  continue;
6486
- const kept = previous.split("\n").filter((line) => !/^\s*用途:/.test(line)).join("\n") || null;
7358
+ const kept = previous.split("\n").filter((line) => !/^\s*(?:用途|说明|取值):/.test(line)).join("\n") || null;
6487
7359
  if (kept !== previous) {
6488
7360
  node[field] = kept;
6489
7361
  changed = true;
@@ -6498,11 +7370,19 @@ function documentConfig(name, content) {
6498
7370
  if (!isScalar(pair.key))
6499
7371
  continue;
6500
7372
  clearGeneratedComments(pair.key);
6501
- const field = [...segments, String(pair.key.value)];
7373
+ const field = [
7374
+ ...segments,
7375
+ String(pair.key.value)
7376
+ ];
6502
7377
  const description = catalogByPath.get([name, ...field].join(".").replace(/\.\d+(?=\.|$)/g, ".0"))?.description;
6503
7378
  if (description) {
6504
7379
  const target = sequenceItem && index === 0 ? node : pair.key;
6505
- const comment = [target.commentBefore, ` \u7528\u9014\uFF1A${description}`].filter(Boolean).join("\n");
7380
+ const entry = catalogByPath.get([name, ...field].join(".").replace(/\.\d+(?=\.|$)/g, ".0"));
7381
+ const comment = [
7382
+ target.commentBefore,
7383
+ ` \u8BF4\u660E\uFF1A${description}`,
7384
+ entry?.constraint ? ` \u53D6\u503C\uFF1A${configurationConstraint(entry.constraint)}` : void 0
7385
+ ].filter(Boolean).join("\n");
6506
7386
  if (target.commentBefore !== comment) {
6507
7387
  target.commentBefore = comment;
6508
7388
  changed = true;
@@ -6511,29 +7391,81 @@ function documentConfig(name, content) {
6511
7391
  walk(pair.value, field);
6512
7392
  }
6513
7393
  } else if (isSeq(node)) {
6514
- node.items.forEach((item, index) => walk(item, [...segments, String(index)], true));
7394
+ node.items.forEach((item, index) => walk(item, [
7395
+ ...segments,
7396
+ String(index)
7397
+ ], true));
6515
7398
  }
6516
7399
  }
6517
7400
  walk(document.contents, []);
6518
- return changed ? document.toString({ lineWidth: 0 }) : content;
7401
+ return documentOptionalConfig(name, changed ? document.toString({ lineWidth: 0 }) : content).replace(/^#[\t ]+$/gm, "#");
7402
+ }
7403
+ function documentOptionalConfig(name, content) {
7404
+ const { lines, document, counter } = readOptionalConfig(content);
7405
+ if (document.errors.length)
7406
+ return content;
7407
+ const additions = /* @__PURE__ */ new Map();
7408
+ function walk(node, path) {
7409
+ if (isMap(node)) {
7410
+ for (const pair of node.items) {
7411
+ if (!isScalar(pair.key))
7412
+ continue;
7413
+ const segments = [
7414
+ ...path,
7415
+ String(pair.key.value)
7416
+ ];
7417
+ const entry = catalogByPath.get([name, ...segments].join(".").replace(/\.\d+(?=\.|$)/g, ".0"));
7418
+ if (entry && pair.key.range) {
7419
+ const line = counter.linePos(pair.key.range[0]).line - 1;
7420
+ const prefix = /^(\s*#\s*)(?:-\s*)?[A-Z][\w-]*:/i.exec(lines[line])?.[1];
7421
+ if (prefix && !additions.has(line))
7422
+ additions.set(line, ` # \u8BF4\u660E\uFF1A${entry.description}\uFF1B\u53D6\u503C\uFF1A${configurationConstraint(entry.constraint)}`);
7423
+ }
7424
+ walk(pair.value, segments);
7425
+ }
7426
+ } else if (isSeq(node)) {
7427
+ node.items.forEach((item, index) => walk(item, [
7428
+ ...path,
7429
+ String(index)
7430
+ ]));
7431
+ }
7432
+ }
7433
+ walk(document.contents, []);
7434
+ return lines.map((line, index) => line + (additions.get(index) ?? "")).join("\n");
7435
+ }
7436
+ function readOptionalConfig(content) {
7437
+ const lines = content.split(/\r?\n/);
7438
+ const virtual = lines.map((line) => line.replace(/^(\s*)# (?=\s*(?:[A-Z][\w-]*:|-\s))/i, "$1")).join("\n");
7439
+ const counter = new LineCounter();
7440
+ const document = parseDocument(virtual, { uniqueKeys: false, lineCounter: counter });
7441
+ return { lines, document, counter };
6519
7442
  }
6520
7443
  function parameterizeConfig(name, content) {
7444
+ content = parameterizeOptionalConfig(name, content);
6521
7445
  const document = parseDocument(content);
6522
7446
  if (document.errors.length > 0)
6523
7447
  throw new Error(`Invalid ${name} configuration template`);
6524
7448
  if (!document.contents || isScalar(document.contents) && document.contents.value === null)
6525
7449
  return content;
7450
+ let changed = false;
6526
7451
  function walk(node, path) {
6527
7452
  if (["templates", "supportedLocales", "id"].includes(path[0]) || path.includes("redact") || name === "audit" && /^(?:userTable|userIdColumn|userNameColumn)$/.test(path[0] ?? "") || name === "iam" && ["ui", "agreements", "rbac"].includes(path[0]) && !(path.at(-1) ?? "").endsWith("Url") || ["id", "name", "operations"].includes(path.at(-1) ?? "") && path.some((segment) => /^\d+$/.test(segment))) {
6528
7453
  return;
6529
7454
  }
6530
7455
  if (isMap(node)) {
6531
7456
  for (const pair of node.items) {
6532
- if (isScalar(pair.key))
6533
- walk(pair.value, [...path, String(pair.key.value)]);
7457
+ if (isScalar(pair.key)) {
7458
+ walk(pair.value, [
7459
+ ...path,
7460
+ String(pair.key.value)
7461
+ ]);
7462
+ }
6534
7463
  }
6535
7464
  } else if (isSeq(node)) {
6536
- node.items.forEach((item, index) => walk(item, [...path, String(index)]));
7465
+ node.items.forEach((item, index) => walk(item, [
7466
+ ...path,
7467
+ String(index)
7468
+ ]));
6537
7469
  } else if (isScalar(node) && node.value !== null && node.value !== void 0) {
6538
7470
  const value = String(node.value);
6539
7471
  if (value.includes("${") || /[\n\r}]/.test(value))
@@ -6543,42 +7475,114 @@ function parameterizeConfig(name, content) {
6543
7475
  const fallback = typeof node.value === "string" && value !== "" && (parsed.errors.length > 0 || !isScalar(parsed.contents) || parsed.contents.value !== value) ? JSON.stringify(value) : value;
6544
7476
  node.value = `\${${variable}:${fallback}}`;
6545
7477
  node.type = Scalar.PLAIN;
7478
+ changed = true;
7479
+ }
7480
+ }
7481
+ walk(document.contents, []);
7482
+ return changed ? document.toString({ lineWidth: 0 }) : content;
7483
+ }
7484
+ function parameterizeOptionalConfig(name, content) {
7485
+ const { lines, document, counter } = readOptionalConfig(content);
7486
+ if (document.errors.length)
7487
+ return content;
7488
+ const edits = /* @__PURE__ */ new Map();
7489
+ function walk(node, segments) {
7490
+ if (isMap(node)) {
7491
+ for (const pair of node.items) {
7492
+ if (isScalar(pair.key)) {
7493
+ walk(pair.value, [
7494
+ ...segments,
7495
+ String(pair.key.value)
7496
+ ]);
7497
+ }
7498
+ }
7499
+ } else if (isSeq(node)) {
7500
+ node.items.forEach((item, index) => walk(item, [
7501
+ ...segments,
7502
+ String(index)
7503
+ ]));
7504
+ } else if (isScalar(node) && node.range && node.value !== null && node.value !== void 0) {
7505
+ const location = counter.linePos(node.range[0]);
7506
+ const line = lines[location.line - 1];
7507
+ if (!/^\s*# /.test(line) || /[\n\r}]/.test(String(node.value)) || String(node.value).includes("${"))
7508
+ return;
7509
+ const field = [name, ...segments].join(".").replace(/\.\d+(?=\.|$)/g, ".0");
7510
+ if (!catalogByPath.has(field) || ["id", "name", "operations"].includes(segments.at(-1) ?? "") || segments.includes("templates") || segments.includes("redact"))
7511
+ return;
7512
+ const variable = ["HAI", name, ...segments].map((part) => part.replace(/[^a-z0-9]+/gi, "_").replace(/^_+|_+$/g, "").toUpperCase()).join("_");
7513
+ const text = String(node.value);
7514
+ const parsed = parseDocument(text);
7515
+ const fallback = typeof node.value === "string" && text !== "" && (parsed.errors.length > 0 || !isScalar(parsed.contents) || parsed.contents.value !== text) ? JSON.stringify(text) : text;
7516
+ const replacement = `\${${variable}:${fallback}}`;
7517
+ const list = edits.get(location.line - 1) ?? [];
7518
+ list.push({
7519
+ start: location.col + 1,
7520
+ end: location.col + 1 + node.range[1] - node.range[0],
7521
+ value: JSON.stringify(replacement)
7522
+ });
7523
+ edits.set(location.line - 1, list);
6546
7524
  }
6547
7525
  }
6548
7526
  walk(document.contents, []);
6549
- return document.toString({ lineWidth: 0 });
7527
+ for (const [index, replacements] of edits) {
7528
+ for (const edit of replacements.sort((a, b) => b.start - a.start))
7529
+ lines[index] = lines[index].slice(0, edit.start) + edit.value + lines[index].slice(edit.end);
7530
+ }
7531
+ return lines.join("\n");
6550
7532
  }
6551
7533
  function configEnvironmentVariables(name, content) {
6552
7534
  const variables = /* @__PURE__ */ new Map();
6553
7535
  const locations = /* @__PURE__ */ new Map();
7536
+ const activeValues = /* @__PURE__ */ new Map();
6554
7537
  function locate(node, path) {
6555
7538
  if (isMap(node)) {
6556
7539
  for (const pair of node.items) {
6557
- if (isScalar(pair.key))
6558
- locate(pair.value, [...path, String(pair.key.value)]);
7540
+ if (isScalar(pair.key)) {
7541
+ locate(pair.value, [
7542
+ ...path,
7543
+ String(pair.key.value)
7544
+ ]);
7545
+ }
6559
7546
  }
6560
7547
  } else if (isSeq(node)) {
6561
- node.items.forEach((item, index) => locate(item, [...path, String(index)]));
7548
+ node.items.forEach((item, index) => locate(item, [
7549
+ ...path,
7550
+ String(index)
7551
+ ]));
6562
7552
  } else if (isScalar(node) && typeof node.value === "string") {
6563
- for (const match of node.value.matchAll(/\$\{([^}:]+)/g))
7553
+ for (const match of node.value.matchAll(/\$\{([^}:]+)(?::([^}]*))?\}/g)) {
6564
7554
  locations.set(match[1], [name, ...path].join("."));
7555
+ if (!activeValues.has(match[1]))
7556
+ activeValues.set(match[1], match[2] ?? "");
7557
+ }
6565
7558
  }
6566
7559
  }
6567
7560
  locate(parseDocument(content).contents, []);
6568
7561
  for (const match of content.matchAll(/\$\{((?:HAI_|PUBLIC_|VITE_|AI_|OPENAI_|GEMINI_|DASHSCOPE_|ARK_|LDAP_)[A-Z0-9_]*)(?::([^}]*))?\}/g)) {
6569
7562
  const [, variable, value = ""] = match;
7563
+ if (variables.has(variable))
7564
+ continue;
7565
+ const normalized = catalogByName.get(variable.replace(/_\d+(?=_|$)/g, "_0"));
7566
+ const entry = catalogByName.get(variable) ?? normalized;
7567
+ const indices = [
7568
+ ...variable.matchAll(/_(\d+)(?=_|$)/g)
7569
+ ].map((item) => item[1]);
7570
+ const catalogPath = (entry?.path === variable ? normalized?.path : entry?.path)?.replace(/\.0(?=\.|$)/g, () => `.${indices.shift() ?? "0"}`);
6570
7571
  variables.set(variable, {
6571
7572
  name: variable,
6572
- path: locations.get(variable) ?? `${name} (${variable}\uFF0C\u53EF\u9009\u5757)`,
6573
- value,
7573
+ path: locations.get(variable) ?? catalogPath ?? `${name} (${variable}\uFF0C\u53EF\u9009\u5757)`,
7574
+ value: activeValues.get(variable) ?? value,
6574
7575
  constraint: variableConstraint(variable, value),
6575
- description: catalogByName.get(variable)?.description
7576
+ description: entry?.description,
7577
+ optional: !locations.has(variable)
6576
7578
  });
6577
7579
  }
6578
- return [...variables.values()];
7580
+ return [
7581
+ ...variables.values()
7582
+ ];
6579
7583
  }
6580
7584
  function variableConstraint(name, value) {
6581
- const known = catalogByName.get(name);
7585
+ const known = catalogByName.get(name) ?? catalogByName.get(name.replace(/_\d+(?=_|$)/g, "_0"));
6582
7586
  if (known)
6583
7587
  return known.constraint;
6584
7588
  const enums = {
@@ -6589,7 +7593,7 @@ function variableConstraint(name, value) {
6589
7593
  HAI_CACHE_TYPE: "memory | redis",
6590
7594
  HAI_STORAGE_TYPE: "local | s3",
6591
7595
  HAI_VECDB_TYPE: "lancedb | pgvector | qdrant | chroma",
6592
- HAI_AI_LLM_API: "chat | responses | anthropic",
7596
+ HAI_AI_LLM_PROTOCOL: "chat | responses | anthropic",
6593
7597
  HAI_DB_SSL: "MySQL\uFF1Afalse \u6216\u4E25\u683C TLS \u5BF9\u8C61\uFF08{} \u9ED8\u8BA4\u6821\u9A8C\u8BC1\u4E66\u94FE\u548C DNS \u8EAB\u4EFD\uFF09\uFF1BPostgreSQL\uFF1A\u5E03\u5C14\u503C\u3001require/prefer/allow/disable \u6216 TLS \u5BF9\u8C61",
6594
7598
  HAI_IAM_PASSWORD_MINLENGTH: "\u6574\u6570 >= 1\uFF0C\u4E14\u4E0D\u5927\u4E8E maxLength",
6595
7599
  HAI_IAM_PASSWORD_MAXLENGTH: "\u6574\u6570 1\u2013256\uFF0C\u4E14\u4E0D\u5C0F\u4E8E minLength",
@@ -6616,8 +7620,9 @@ function variableConstraint(name, value) {
6616
7620
  return "\u6574\u6570 1\u201365535";
6617
7621
  if (name.endsWith("TEMPERATURE"))
6618
7622
  return "\u6570\u5B57 0\u20132";
6619
- if (/^HAI_AI_.*(?:TIMEOUT|MAXTOKENS|CACHE_TTL)$/.test(name))
7623
+ if (/^HAI_AI_.*(?:TIMEOUT|MAXTOKENS|CACHE_TTL)$/.test(name)) {
6620
7624
  return name.endsWith("MAXTOKENS") ? "\u6570\u5B57 > 0\uFF0C\u5355\u4F4D token" : "\u6570\u5B57 > 0\uFF0C\u5355\u4F4D\u6BEB\u79D2";
7625
+ }
6621
7626
  if (name === "HAI_CACHE_DB")
6622
7627
  return "\u6574\u6570 0\u201315";
6623
7628
  if (name === "HAI_DB_DATABASE")
@@ -6643,18 +7648,29 @@ function runtimeEnvironmentVariables(content) {
6643
7648
  const variables = /* @__PURE__ */ new Map();
6644
7649
  for (const match of content.matchAll(/(?:process\.env|import\.meta\.env)(?:\?\.)?\.?(?:([A-Z][A-Z0-9_]+)|\[['"]([A-Z][A-Z0-9_]+)['"]\])|\$\{((?:HAI_|PUBLIC_|VITE_)[A-Z0-9_]+)(?::[^}]*)?\}/g)) {
6645
7650
  const name = match[1] ?? match[2] ?? match[3];
6646
- if (match[0].startsWith("import.meta.env") && ["SSR", "MODE", "DEV", "PROD", "BASE_URL"].includes(name))
7651
+ if (match[0].startsWith("import.meta.env") && [
7652
+ "SSR",
7653
+ "MODE",
7654
+ "DEV",
7655
+ "PROD",
7656
+ "BASE_URL"
7657
+ ].includes(name)) {
6647
7658
  continue;
7659
+ }
6648
7660
  const variable = catalogByName.get(name);
6649
7661
  if (variable)
6650
7662
  variables.set(name, variable);
6651
7663
  }
6652
- return [...variables.values()];
7664
+ return [
7665
+ ...variables.values()
7666
+ ];
6653
7667
  }
6654
7668
 
6655
7669
  // src/commands/cli-config-templates.ts
6656
- function generateConfigFile(moduleKey, configs) {
6657
- return documentConfig(moduleKey, parameterizeConfig(moduleKey, generateLiteralConfigFile(moduleKey, configs)));
7670
+ function generateConfigFile(moduleKey, configs, enabled = true) {
7671
+ const content = documentConfig(moduleKey, parameterizeConfig(moduleKey, generateLiteralConfigFile(moduleKey, configs)));
7672
+ return enabled ? content : `# # \u672A\u542F\u7528\uFF1A\u5B89\u88C5\u5BF9\u5E94\u6A21\u5757\u5E76\u5728\u670D\u52A1\u7AEF runtime \u4E2D\u521D\u59CB\u5316\uFF0C\u518D\u53D6\u6D88\u6240\u9700\u914D\u7F6E\u7684\u6CE8\u91CA\u3002
7673
+ ${content.split("\n").map((line) => line ? `# ${line}` : "").join("\n")}`;
6658
7674
  }
6659
7675
  function generateLiteralConfigFile(moduleKey, configs) {
6660
7676
  switch (moduleKey) {
@@ -6709,6 +7725,8 @@ logging:
6709
7725
  format: pretty
6710
7726
  # context:
6711
7727
  # service: api
7728
+ # redact \u586B\u65E5\u5FD7\u5B57\u6BB5\u8DEF\u5F84\uFF1Bcustomer.email \u906E\u76D6\u5BA2\u6237\u90AE\u7BB1\uFF0Crecipients[*].phone \u906E\u76D6\u6570\u7EC4\u4E2D\u7684\u7535\u8BDD\u3002
7729
+ # \u53EA\u5339\u914D\u6307\u5B9A\u5C42\u7EA7\uFF0C* \u5339\u914D\u4E00\u5C42\uFF1B\u5BC6\u7801\u548C\u4EE4\u724C\u7B49\u5DF2\u77E5\u51ED\u636E\u9ED8\u8BA4\u4ECD\u4F1A\u8131\u654F\u3002
6712
7730
  redact:
6713
7731
  - password
6714
7732
  - token
@@ -6745,22 +7763,24 @@ http:
6745
7763
  access: false
6746
7764
  # access:
6747
7765
  # file: ./config/security/request-access.yml
7766
+ # \u6216\u5C06 access: false \u66FF\u6362\u4E3A\u4E0B\u5217\u5185\u8054\u914D\u7F6E\uFF1B\u4E0E file \u4E8C\u9009\u4E00\u3002
7767
+ # access:
7768
+ # global:
7769
+ # timezone: UTC # \u53EF\u7528 HAI_SERV_HTTP_ACCESS_GLOBAL_TIMEZONE=Asia/Shanghai
7770
+ # allowIps: []
7771
+ # denyIps: []
7772
+ # windows: []
7773
+ # rules: []
6748
7774
  apiPrefix: /api/v1
6749
7775
  openapi:
6750
7776
  path: /openapi.json
7777
+ # HAI_SERV_HTTP_DOCS=false \u5173\u95ED\u6587\u6863\uFF1B\u5F00\u542F\u65F6\u518D\u914D\u7F6E path/requireAuth\u3002
6751
7778
  docs:
6752
7779
  path: /docs
6753
7780
  # requireAuth: true
6754
7781
  health:
6755
7782
  path: /health
6756
7783
  readyPath: /ready
6757
- rpc: false
6758
- # \u542F\u7528\u5185\u90E8 RPC \u65F6\u7528\u5BF9\u8C61\u66FF\u6362 false\uFF0Cgateway-only \u5FC5\u987B\u914D\u7F6E\u7F51\u5173\u5BC6\u94A5\u3002
6759
- # rpc:
6760
- # prefix: /api/rpc
6761
- # access: gateway-only # loopback | private-network | gateway-only
6762
- # gatewayHeader: X-Gateway-Key
6763
- # gatewaySecret: \${HAI_SERV_HTTP_RPC_GATEWAYSECRET}
6764
7784
 
6765
7785
  # \u6309\u9700\u5F00\u542F\u8DE8\u57DF\u8BBF\u95EE\uFF0C\u751F\u4EA7\u73AF\u5883\u586B\u5199\u660E\u786E\u7684 Origin\u3002
6766
7786
  # cors:
@@ -6776,6 +7796,9 @@ transport: false
6776
7796
  # maxPlaintextBytes: \${HAI_SERV_TRANSPORT_MAXPLAINTEXTBYTES:1048576} # \u53CC\u5411 UTF-8 \u660E\u6587\uFF0C1 KiB\uFF5E64 MiB
6777
7797
  # keyExchangePath: /_hai/key-exchange
6778
7798
  # excludePaths: [/health, /ready]
7799
+ # \u5355\u6761\u8DEF\u5F84\u9700\u8981\u66F4\u5927\u8BF7\u6C42\u4F53\u65F6\u586B\u5199\u5B57\u8282\u6570\uFF0C* \u53EA\u5339\u914D\u4E00\u6BB5\u8DEF\u5F84\u3002
7800
+ # routePlaintextBytes: # HAI_SERV_TRANSPORT_ROUTEPLAINTEXTBYTES \u53EF\u586B JSON \u8DEF\u5F84\u6620\u5C04
7801
+ # /api/v1/uploads/*: 8388608
6779
7802
  `;
6780
7803
  }
6781
7804
  function generateDbConfig(cfg) {
@@ -6797,7 +7820,7 @@ function generateDbConfig(cfg) {
6797
7820
  # MySQL \u4E13\u7528\uFF1BPostgreSQL \u65E0\u9700\u6B64\u5757\u3002
6798
7821
  # mysql:
6799
7822
  # charset: utf8mb4
6800
- # timezone: '+08:00'`;
7823
+ # MySQL \u4E0D\u652F\u6301 timezone \u914D\u7F6E\uFF1B\u4E0D\u8981\u5728 mysql \u5757\u5185\u586B\u5199\u8BE5\u5B57\u6BB5\u3002`;
6801
7824
  return `# =============================================================================
6802
7825
  # \u6570\u636E\u5E93\u914D\u7F6E
6803
7826
  # =============================================================================
@@ -6813,7 +7836,7 @@ url: \${HAI_DB_URL:}
6813
7836
  ssl: \${HAI_DB_SSL:false}
6814
7837
  ${networkOptions}
6815
7838
 
6816
- # SQL \u65E5\u5FD7\u6309\u9700\u5F00\u542F\uFF1BmaxLength \u9650\u5236 SQL / \u53C2\u6570\u8F93\u51FA\u957F\u5EA6\u3002
7839
+ # \u64CD\u4F5C\u65E5\u5FD7\u6309\u9700\u5F00\u542F\uFF0C\u53EA\u8BB0\u5F55\u8017\u65F6\u3001\u6570\u91CF\u7B49\u5B89\u5168\u6458\u8981\uFF1BmaxLength \u9650\u5236\u6458\u8981\u957F\u5EA6\uFF0C\u4E0D\u8BB0\u5F55 SQL \u539F\u6587\u548C\u53C2\u6570\u3002
6817
7840
  # operationLog:
6818
7841
  # read: false
6819
7842
  # write: false
@@ -6825,7 +7848,12 @@ function generateCacheConfig(cfg) {
6825
7848
  const cacheType = cfg?.type ?? "memory";
6826
7849
  const host = cfg?.host ?? "localhost";
6827
7850
  const port = cfg?.port ?? 6379;
6828
- const connection = stringify({ host, port, password: "", keyPrefix: "hai:" }).trim();
7851
+ const connection = stringify({
7852
+ host,
7853
+ port,
7854
+ password: "",
7855
+ keyPrefix: "hai:"
7856
+ }).trim();
6829
7857
  return `# =============================================================================
6830
7858
  # \u7F13\u5B58\u914D\u7F6E
6831
7859
  # =============================================================================
@@ -6903,7 +7931,7 @@ captcha:
6903
7931
  # apikey:
6904
7932
  # maxKeysPerUser: 10
6905
7933
  # defaultExpirationDays: 0 # 0 \u8868\u793A\u4E0D\u9650\u5236\u6709\u6548\u671F
6906
- # prefix: hai_
7934
+ # prefix: hai_ # \u65B0\u5EFA API Key \u7684\u5F00\u5934\uFF0C\u4F8B\u5982 hai_abc123\uFF1B\u53EA\u586B\u5E94\u7528\u6807\u8BC6\uFF0C\u4E0D\u653E\u5BC6\u7801\u3002
6907
7935
  # OTP \u9700\u542F\u7528 login.otp\uFF0C\u5E76\u9009\u62E9 Reach \u6807\u51C6\u6A21\u677F\u6216\u81EA\u5B9A\u4E49\u53D1\u9001\u56DE\u8C03\u3002
6908
7936
  ${(loginOtp ? "" : "# \u4FDD\u7559\u9ED8\u8BA4\u7B56\u7565\u5165\u53E3\uFF0C\u5355\u72EC\u5207\u6362 login.otp \u5373\u53EF\u542F\u7528\u9A8C\u8BC1\u7801\u767B\u5F55\u3002\notp: {}\n# \u5B9A\u5236\u7B56\u7565\u65F6\u7528\u4E0B\u65B9\u914D\u7F6E\u5757\u66FF\u6362\u7A7A\u5BF9\u8C61\uFF0C\u6216\u901A\u8FC7 HAI_IAM_OTP \u6574\u4F53\u8986\u76D6\u3002\n") + `otp:
6909
7937
  email: true
@@ -6967,7 +7995,12 @@ loginAccess:
6967
7995
  timezone: UTC
6968
7996
  allowIps: [] # \u7A7A\u5217\u8868\u4E0D\u9650\u5236\uFF1B\u652F\u6301 IPv4\u3001IPv6 \u4E0E CIDR
6969
7997
  denyIps: [] # \u62D2\u7EDD\u4F18\u5148
6970
- windows: [] # days \u4E3A\u5468\u4E001\u81F3\u5468\u65E57\uFF1Bstart/end \u4E3A HH:mm\uFF0C\u652F\u6301\u8DE8\u5348\u591C
7998
+ windows: [] # \u7559\u7A7A\u5141\u8BB8\u4EFB\u4F55\u65F6\u95F4\uFF1B\u4EE5\u4E0B\u4F8B\u5B50\u53EA\u5141\u8BB8\u5468\u4E00\u81F3\u5468\u4E94 09:00\u201318:00 \u767B\u5F55\u3002
7999
+ # windows:
8000
+ # - days: [1, 2, 3, 4, 5]
8001
+ # start: '09:00'
8002
+ # end: '18:00'
8003
+ # timezone \u8BBE\u4E3A Asia/Shanghai \u65F6\uFF0C\u4E0A\u8FF0\u65F6\u95F4\u6309\u5317\u4EAC\u65F6\u95F4\u89E3\u91CA\u3002
6971
8004
 
6972
8005
  # \u4F1A\u8BDD\u914D\u7F6E
6973
8006
  session:
@@ -6978,7 +8011,11 @@ session:
6978
8011
  singleDeviceMode: replace # replace \u9876\u65E7\u4FDD\u65B0\uFF1Breject \u62D2\u7EDD\u91CD\u590D\u767B\u5F55
6979
8012
  maxSessions: 0 # \u6BCF\u7528\u6237\u6709\u6548\u4F1A\u8BDD\u4E0A\u9650\uFF0C0 \u4E0D\u9650\u5236
6980
8013
  # \u6309\u7EC8\u7AEF\u5206\u522B\u9650\u5236\uFF1B\u975E\u7A7A\u65F6\u4EC5\u5141\u8BB8\u5217\u51FA\u7684\u7C7B\u578B\uFF0C\u4ECD\u53D7\u5168\u5C40\u6700\u5927\u4F1A\u8BDD\u6570\u7EA6\u675F\u3002
6981
- terminalLimits: {}
8014
+ terminalLimits: {} # \u7559\u7A7A\u4E0D\u6309\u7EC8\u7AEF\u9650\u5236\u3002\u4E0B\u9762\u4F8B\u5B50\u5141\u8BB8 web 2 \u4E2A\u3001app 1 \u4E2A\uFF0C\u5176\u4F59\u7EC8\u7AEF\u4E0D\u5141\u8BB8\u65B0\u767B\u5F55\u3002
8015
+ # terminalLimits:
8016
+ # web: 2
8017
+ # app: 1
8018
+ # \u524D\u7AEF\u53D1\u9001\u7684\u7EC8\u7AEF\u540D\u79F0\u5FC5\u987B\u4E0E\u952E\u540D\u76F8\u540C\uFF1B\u6B64\u9650\u5236\u540C\u65F6\u53D7 maxSessions \u7EA6\u675F\u3002
6982
8019
  terminalLimitMode: reject
6983
8020
  idleTimeout: 0 # \u95F2\u7F6E\u671F\u9650\uFF08\u79D2\uFF09\uFF0C0 \u5173\u95ED\uFF1Baccess/refresh \u5747\u6267\u884C
6984
8021
  absoluteTimeout: 0 # \u4ECE\u9996\u6B21\u767B\u5F55\u8D77\u7684\u7EDD\u5BF9\u671F\u9650\uFF08\u79D2\uFF09\uFF0C0 \u5173\u95ED
@@ -7012,8 +8049,9 @@ accessKeyId: ''
7012
8049
  secretAccessKey: ''
7013
8050
  endpoint: \${HAI_STORAGE_ENDPOINT:https://s3.amazonaws.com}
7014
8051
  forcePathStyle: false
7015
- # prefix: ''
7016
- # publicEndpoint: https://app.example.com # \u79C1\u6709\u9884\u7B7E\u540D\u8BBF\u95EE\u6E90\uFF1B\u4E0D\u542B\u6876\u540D\u6216\u7F51\u7AD9\u76EE\u5F55
8052
+ # \u53EF\u76F4\u63A5\u8BBE\u7F6E HAI_STORAGE_PREFIX=my-app/uploads/\uFF1B\u4FDD\u5B58 report.pdf \u540E\u7684\u952E\u540D\u4E3A my-app/uploads/report.pdf\u3002
8053
+ # prefix: "\${HAI_STORAGE_PREFIX:}"
8054
+ # publicEndpoint: https://app.example.com # \u6D4F\u89C8\u5668\u4E0B\u8F7D\u5165\u53E3\uFF0C\u53EF\u5E26 /files \u7B49\u4EE3\u7406\u76EE\u5F55\uFF1B\u4E0D\u542B\u6876\u540D
7017
8055
  # publicUrl: https://cdn.example.com`;
7018
8056
  return `# \u5B58\u50A8\u914D\u7F6E\uFF1BHAI_STORAGE \u53EF\u6574\u4F53\u66FF\u6362\u8FDE\u63A5\u914D\u7F6E\u3002
7019
8057
  type: ${type}
@@ -7037,7 +8075,7 @@ function generateAiConfig(cfg) {
7037
8075
  # AI \u914D\u7F6E
7038
8076
  # =============================================================================
7039
8077
 
7040
- # LLM \u914D\u7F6E\uFF08\u5FC5\u586B\uFF09
8078
+ # \u5BF9\u8BDD\u6A21\u578B\uFF08\u4F7F\u7528\u5BF9\u8BDD\u529F\u80FD\u65F6\u914D\u7F6E\uFF09
7041
8079
  llm:
7042
8080
  # API Key\uFF08\u7EA6\u5B9A\u73AF\u5883\u53D8\u91CF HAI_AI_LLM_APIKEY \u4F18\u5148\uFF09
7043
8081
  apiKey: ''
@@ -7045,7 +8083,7 @@ llm:
7045
8083
  # baseUrl: https://api.openai.com/v1
7046
8084
  # \u9ED8\u8BA4\u6A21\u578B
7047
8085
  ${stringify({ model }).trim().split("\n").map((line) => ` ${line}`).join("\n")}
7048
- api: ${api} # chat | responses | anthropic
8086
+ protocol: ${api} # \u8BF7\u6C42\u683C\u5F0F\uFF1AOpenAI \u517C\u5BB9\u9009 chat\uFF0CResponses \u9009 responses\uFF0CClaude Messages \u9009 anthropic\u3002
7049
8087
  # \u5168\u5C40\u6700\u5927 Token \u6570\uFF08\u9ED8\u8BA4 4096\uFF09
7050
8088
  # maxTokens: 4096
7051
8089
  # \u91C7\u6837\u6E29\u5EA6\uFF080-2\uFF0C\u9ED8\u8BA4 0.7\uFF09
@@ -7054,21 +8092,34 @@ ${stringify({ model }).trim().split("\n").map((line) => ` ${line}`).join("\n")}
7054
8092
  # timeout: 60000
7055
8093
  # tempModelCacheTtl: 600000
7056
8094
 
7057
- # \u591A\u6A21\u578B\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u573A\u666F\u8DEF\u7531\uFF09
8095
+ # \u591A\u6A21\u578B\u914D\u7F6E\uFF1Aid \u662F\u5E94\u7528\u4E2D\u7684\u77ED\u540D\uFF0Cmodel \u662F\u4F9B\u5E94\u5546\u7684\u771F\u5B9E\u578B\u53F7\u3002\u5404\u9879\u53EF\u5355\u72EC\u8BBE\u7F6E\u534F\u8BAE\u3001\u5730\u5740\u548C\u5BC6\u94A5\u3002
7058
8096
  # models:
7059
8097
  # - id: fast
7060
8098
  # model: gpt-4o-mini
7061
- # api: chat
8099
+ # protocol: chat
7062
8100
  # apiKey: ''
7063
8101
  # baseUrl: https://api.openai.com/v1
7064
8102
  # maxTokens: 4096
7065
8103
  # temperature: 0.7
7066
8104
  # timeout: 60000
8105
+ # capabilities: # \u80FD\u529B\u6765\u81EA\u4F9B\u5E94\u5546\u786E\u8BA4\uFF1B\u672A\u77E5\u65F6\u7701\u7565\uFF0C\u4E0D\u80FD\u7528 maxTokens \u9884\u7B97\u731C\u5BB9\u91CF\u3002
8106
+ # contextWindow: 128000
8107
+ # maxOutputTokens: 16384
8108
+ # inputModalities: [text, image]
8109
+ # outputModalities: [text]
8110
+ # toolCalling: true
8111
+ # reasoning:
8112
+ # supported: false
7067
8113
  # - id: smart
7068
8114
  # model: gpt-4o
7069
8115
  # apiKey: ''
8116
+ # - id: coding # Codex \u4F7F\u7528\u72EC\u7ACB\u7684 Responses \u7AEF\u70B9\uFF1B\u6309\u5B9E\u9645\u670D\u52A1\u586B\u5199\u578B\u53F7\u3001\u5730\u5740\u548C\u5BC6\u94A5\u3002
8117
+ # model: your-coding-model
8118
+ # protocol: responses
8119
+ # baseUrl: https://your-responses-service.example/v1
8120
+ # apiKey: ''
7070
8121
 
7071
- # \u573A\u666F\u6A21\u578B\u6620\u5C04\uFF08\u53EF\u9009\uFF09
8122
+ # \u573A\u666F\u6A21\u578B\u6620\u5C04\uFF1A\u666E\u901A\u5BF9\u8BDD\u7528 fast\uFF0C\u590D\u6742\u63A8\u7406\u7528 smart\uFF1B\u503C\u5BF9\u5E94\u4E0A\u65B9 models \u7684 id\u3002
7072
8123
  # scenarios:
7073
8124
  # default: fast
7074
8125
  # chat: fast
@@ -7084,7 +8135,39 @@ ${stringify({ model }).trim().split("\n").map((line) => ` ${line}`).join("\n")}
7084
8135
  # embedding / rerank / vision \u987B\u5728 models \u4E2D\u58F0\u660E\u5BF9\u5E94\u5382\u5546\u6A21\u578B\uFF0C\u4E0D\u80FD\u53EA\u586B\u5199\u573A\u666F ID\u3002
7085
8136
 
7086
8137
  # \u53EF\u9009\u5B50\u6A21\u5757\u53EA\u53D6\u6D88\u9700\u8981\u7684\u5757\uFF1B\u751F\u4EA7\u73AF\u5883\u5148\u521D\u59CB\u5316\u5171\u4EAB\u6570\u636E\u5E93\u4E0E\u7F51\u7EDC\u5411\u91CF\u5E93\uFF0C\u518D\u521D\u59CB\u5316 AI\u3002
8138
+ # ACP \u4EC5\u670D\u52A1\u7AEF\u4F7F\u7528\uFF1Bagents/workspaces \u53EF\u5199\u914D\u7F6E\u6216\u901A\u8FC7 ai.acp \u4FDD\u5B58\u6570\u636E\u5E93\uFF0C\u914D\u7F6E\u540C ID \u4F18\u5148\u4E14\u53EA\u8BFB\u3002
8139
+ # \u6A21\u578B\u3001MCP\u3001\u68C0\u7D22\u6E90\u6E05\u5355\u540C\u6837\u5408\u5E76\u4E24\u4EFD\u6765\u6E90\uFF0C\u8BE6\u89C1 .agents/skills/hai-ai/resources.md\u3002
8140
+ # embedded \u5728\u672C\u673A\u8FD0\u884C\u539F\u751F\u8FDB\u7A0B\uFF1Bbuiltin-service \u4F7F\u7528 Podman \u4F18\u5148\u7684\u5BB9\u5668\u548C\u6301\u4E45 volume\uFF1B
8141
+ # custom-service \u8FDE\u63A5\u539F\u751F HTTP/WS \u670D\u52A1\uFF0C\u4E0D\u6CE8\u5165\u6A21\u578B\u3002\u8BE6\u89C1 .agents/skills/hai-ai/acp.md\u3002
8142
+ # acp:
8143
+ # requestTimeout: 30000
8144
+ # promptTimeout: 600000
8145
+ # cancelTimeout: 5000
8146
+ # maxContentBytes: 8388608
8147
+ # maxPendingEvents: 1024
8148
+ # agents:
8149
+ # - id: coder
8150
+ # name: Codex
8151
+ # mode: embedded
8152
+ # adapter: codex
8153
+ # modelIds: [coding]
8154
+ # workspaces:
8155
+ # - id: project
8156
+ # storage:
8157
+ # type: directory
8158
+ # path: /srv/projects/project
8159
+ # repositories:
8160
+ # - id: api
8161
+ # url: https://git.example.com/team/api.git
8162
+ # mainBranch: trunk
7087
8163
  # mcp:
8164
+ # servers:
8165
+ # - id: docs
8166
+ # name: Docs
8167
+ # transport: stdio
8168
+ # command: docs-mcp
8169
+ # environmentRefs:
8170
+ # API_TOKEN: DOCS_API_TOKEN
7088
8171
  # server:
7089
8172
  # name: my-app
7090
8173
  # version: 1.0.0
@@ -7205,12 +8288,38 @@ ${stringify({ model }).trim().split("\n").map((line) => ` ${line}`).join("\n")}
7205
8288
  `;
7206
8289
  }
7207
8290
  function generateEnvExample(features, configs, includeDisabled = false, configContents = {}) {
7208
- const keys = /* @__PURE__ */ new Set(["core", ...configContents.serv ? ["serv"] : [], ...features.filter((feature) => !["crypto", "api-client", "capacitor", "datapipe"].includes(feature))]);
7209
- const allKeys = ["core", "serv", "db", "cache", "iam", "storage", "ai", "vecdb", "reach", "payment", "scheduler", "deploy", "audit", "feedback"];
8291
+ const keys = /* @__PURE__ */ new Set([
8292
+ "core",
8293
+ ...["serv", "kit"].filter((key) => configContents[key]),
8294
+ ...features.filter((feature) => ![
8295
+ "crypto",
8296
+ "api-client",
8297
+ "capacitor",
8298
+ "datapipe"
8299
+ ].includes(feature))
8300
+ ]);
8301
+ const allKeys = [
8302
+ "core",
8303
+ "serv",
8304
+ "kit",
8305
+ "crypto",
8306
+ "db",
8307
+ "cache",
8308
+ "iam",
8309
+ "storage",
8310
+ "ai",
8311
+ "vecdb",
8312
+ "reach",
8313
+ "payment",
8314
+ "scheduler",
8315
+ "deploy",
8316
+ "audit",
8317
+ "feedback"
8318
+ ];
7210
8319
  const sections = [`# Environment configuration
7211
8320
  # .env / .env.dev / .env.test / .env.prod are public configuration tracked in Git.
7212
8321
  # .env.local is private to this machine and ignored by Git.
7213
- # Priority: process environment > .env.local > .env.<dev|test|prod> > .env.
8322
+ # Priority: process environment > .env.<mode>.local > .env.local > .env.<mode> > .env > YAML.
7214
8323
  # Naming: HAI_<CONFIG>_<PATH>; camelCase stays joined (apiKey -> APIKEY); arrays use zero-based indexes.
7215
8324
  # PUBLIC_ / VITE_ variables are visible in browsers and must never contain secrets.
7216
8325
  # YAML declares references and local fallbacks; constraints are validated by module Schemas.
@@ -7220,16 +8329,22 @@ function generateEnvExample(features, configs, includeDisabled = false, configCo
7220
8329
  if (!keys.has(key) && !includeDisabled)
7221
8330
  continue;
7222
8331
  const variables = configEnvironmentVariables(key, configContents[key] ?? generateConfigFile(key, configs));
7223
- const section = renderEnvironment(variables);
8332
+ const section = renderEnvironment(variables.filter((variable) => !variable.optional));
8333
+ const declaredOptional = renderEnvironment(variables.filter((variable) => variable.optional));
7224
8334
  const activeNames = new Set(variables.map((variable) => variable.name));
7225
- const optional = renderEnvironment(moduleEnvironmentVariables(key).filter((variable) => !activeNames.has(variable.name)));
8335
+ const candidates = moduleEnvironmentVariables(key);
8336
+ const primitiveArrays = candidates.filter((variable) => variable.constraint.includes("JSON \u6570\u7EC4") && candidates.some((child) => child.name === `${variable.name}_0` && !child.constraint.includes("JSON \u5BF9\u8C61")));
8337
+ const optional = renderEnvironment(candidates.filter((variable) => !activeNames.has(variable.name) && !primitiveArrays.some((parent) => variable.name.startsWith(`${parent.name}_`)) && !variables.some((child) => child.name.startsWith(`${variable.name}_`) && (variable.constraint.includes("JSON \u5BF9\u8C61") || variable.constraint.includes("JSON \u6570\u7EC4")) && !variable.constraint.includes("false")) && (!(variable.constraint.includes("JSON \u5BF9\u8C61") || variable.constraint.includes("JSON \u6570\u7EC4")) || variable.constraint.includes("false") || !candidates.some((child) => child.name.startsWith(`${variable.name}_`)) || primitiveArrays.includes(variable))));
7226
8338
  const commented = (value) => value.split("\n").map((line) => line && !line.startsWith("#") ? `# ${line}` : line).join("\n");
7227
8339
  sections.push(`# --- ${key} ---
7228
8340
  ${keys.has(key) ? section : commented(section)}
7229
8341
 
7230
- # \u53EF\u9009\u5B57\u6BB5\uFF1A\u5148\u542F\u7528 YAML \u8DEF\u5F84\uFF0C\u6216\u7528\u7236\u7EA7\u5BF9\u8C61\u6574\u4F53\u8986\u76D6\u3002
8342
+ # \u53EF\u9009\u5B57\u6BB5\uFF1A\u5148\u5728 YAML \u4E2D\u542F\u7528\u5BF9\u5E94\u914D\u7F6E\u5757\uFF1B\u4E0B\u5217\u53D8\u91CF\u540D\u4E0E\u5B57\u6BB5\u8DEF\u5F84\u4E00\u4E00\u5BF9\u5E94\u3002
8343
+ ${commented(declaredOptional)}
7231
8344
  ${commented(optional)}`);
7232
8345
  }
8346
+ if (includeDisabled)
8347
+ sections.push("# \u670D\u52A1\u7AEF\u4F20\u8F93\u5BC6\u94A5\u73AF\uFF1A\u542F\u7528 crypto transport \u540E\uFF0C\u901A\u8FC7\u79C1\u6709\u73AF\u5883\u6CE8\u5165\u7248\u672C\u5316 JSON\uFF1B\u4E0D\u5F97\u4E0B\u53D1\u5230\u6D4F\u89C8\u5668\u3002\n# HAI_CRYPTO_TRANSPORT_SERVERKEYRING=");
7233
8348
  return `${sections.join("\n\n")}
7234
8349
  `;
7235
8350
  }
@@ -7248,7 +8363,14 @@ function generateProductionEnvironment(features, configs) {
7248
8363
  if (enabled.has("db")) {
7249
8364
  const mysql = configs?.db?.type === "mysql";
7250
8365
  const database = configs?.db?.type !== "sqlite" && configs?.db?.database ? configs.db.database : "hai";
7251
- sections.push("", "# \u5FC5\u987B\u79C1\u6709\u6CE8\u5165 HAI_DB_PASSWORD\uFF1B\u5916\u90E8\u6570\u636E\u5E93\u53EF\u8986\u76D6\u4E0B\u5217\u8FDE\u63A5\u5B57\u6BB5\u3002", `HAI_DB_TYPE=${mysql ? "mysql" : "postgresql"}`, "HAI_DB_HOST=db", `HAI_DB_PORT=${mysql ? 3306 : 5432}`, renderEnvironment([{ name: "HAI_DB_DATABASE", path: "db.database", value: database, constraint: "\u751F\u4EA7\u6570\u636E\u5E93\u540D" }]), `HAI_DB_USER=${mysql ? "root" : "postgres"}`);
8366
+ sections.push("", "# \u5FC5\u987B\u79C1\u6709\u6CE8\u5165 HAI_DB_PASSWORD\uFF1B\u5916\u90E8\u6570\u636E\u5E93\u53EF\u8986\u76D6\u4E0B\u5217\u8FDE\u63A5\u5B57\u6BB5\u3002", `HAI_DB_TYPE=${mysql ? "mysql" : "postgresql"}`, "HAI_DB_HOST=db", `HAI_DB_PORT=${mysql ? 3306 : 5432}`, renderEnvironment([
8367
+ {
8368
+ name: "HAI_DB_DATABASE",
8369
+ path: "db.database",
8370
+ value: database,
8371
+ constraint: "\u751F\u4EA7\u6570\u636E\u5E93\u540D"
8372
+ }
8373
+ ]), `HAI_DB_USER=${mysql ? "root" : "postgres"}`);
7252
8374
  }
7253
8375
  if (enabled.has("cache"))
7254
8376
  sections.push("", "# \u5FC5\u987B\u79C1\u6709\u6CE8\u5165 HAI_CACHE_PASSWORD\u3002", "HAI_CACHE_TYPE=redis", "HAI_CACHE_HOST=cache", "HAI_CACHE_PORT=6379");
@@ -7260,7 +8382,7 @@ function generateProductionEnvironment(features, configs) {
7260
8382
  if (enabled.has("ai"))
7261
8383
  sections.push("", "# \u5FC5\u987B\u79C1\u6709\u6CE8\u5165 HAI_AI_LLM_APIKEY \u53CA\u6240\u9009\u6A21\u578B\u7684\u5176\u5B83\u51ED\u636E\uFF1BAI \u81EA\u52A8\u590D\u7528\u5DF2\u521D\u59CB\u5316\u7684\u5171\u4EAB db/vecdb\u3002");
7262
8384
  if (enabled.has("reach")) {
7263
- sections.push("", "# \u5FC5\u987B\u79C1\u6709\u6CE8\u5165 HAI_REACH_PROVIDERS \u7684\u771F\u5B9E SMTP/SMS/API JSON\uFF08\u5305\u542B\u51ED\u636E\uFF09\u3002", "# \u7A7A\u6570\u7EC4\u6709\u610F\u8BA9\u914D\u7F6E\u6821\u9A8C\u62D2\u7EDD\u542F\u52A8\uFF0C\u751F\u4EA7\u4E0D\u5F97\u6CBF\u7528\u5F00\u53D1 console Provider\u3002", "HAI_REACH_PROVIDERS='[]'");
8385
+ sections.push("", "# \u5728 .env.prod.local \u6216\u90E8\u7F72\u8FDB\u7A0B\u4E2D\u7528 HAI_REACH_PROVIDERS \u6CE8\u5165\u5B8C\u6574\u7684\u751F\u4EA7\u901A\u77E5 Provider JSON\u3002", "# \u7A7A\u6570\u7EC4\u6709\u610F\u8BA9\u5E94\u7528\u62D2\u7EDD\u542F\u52A8\u3002\u53EA\u6709\u5B8C\u6574\u5217\u8868\u4E2D\u5DF2\u6709\u7684\u9879\u624D\u80FD\u4F7F\u7528\u7D22\u5F15\u73AF\u5883\u53D8\u91CF\u8986\u76D6\u3002", "HAI_REACH_PROVIDERS='[]'");
7264
8386
  }
7265
8387
  return `${sections.join("\n")}
7266
8388
  `;
@@ -7276,6 +8398,16 @@ provider:
7276
8398
  expose:
7277
8399
  hostPort: 18080
7278
8400
  containerPort: 3000
8401
+ # HTTPS \u4E5F\u53EF\u5728 pnpm run deploy \u7684\u53EF\u9009\u8BC1\u4E66\u73AF\u8282\u4E2D\u914D\u7F6E\u3002
8402
+ # https:
8403
+ # type: files
8404
+ # domain: app.example.com
8405
+ # port: 443
8406
+ # redirectHttp: true
8407
+ # certificateFile: .hai/certificates/fullchain.pem
8408
+ # privateKeyFile: .hai/certificates/privkey.pem
8409
+ # Let's Encrypt\uFF1Atype \u6539\u4E3A letsencrypt\uFF0CHTTP hostPort \u8BBE\u4E3A 80\uFF1B
8410
+ # \u4EE5 email \u548C acceptTerms: true \u66FF\u4EE3\u4E24\u4E2A\u6587\u4EF6\u8DEF\u5F84\u3002
7279
8411
 
7280
8412
  container:
7281
8413
  s3Engine: \${HAI_DEPLOY_CONTAINER_S3ENGINE:rustfs} # rustfs | minio
@@ -7348,7 +8480,10 @@ providers:
7348
8480
  - name: console_dev
7349
8481
  type: console
7350
8482
 
7351
- # SMTP \u90AE\u4EF6\uFF08\u6309\u9700\u5F00\u542F\uFF09
8483
+ # \u751F\u4EA7\u793A\u4F8B\uFF1A\u7528\u4E0B\u9762 providers \u6574\u6BB5\u66FF\u6362\u4E0A\u65B9\u63A7\u5236\u53F0\u5217\u8868\uFF1B\u4FDD\u7559\u9700\u8981\u7684\u9879\u3002
8484
+ # \u6570\u7EC4\u7D22\u5F15\u4ECE 0 \u5F00\u59CB\uFF0C\u5220\u6389\u67D0\u9879\u540E\u540C\u6B65\u4FEE\u6539\u5176\u4F59\u73AF\u5883\u53D8\u91CF\u4E2D\u7684\u7D22\u5F15\u3002
8485
+ # providers:
8486
+ # SMTP \u90AE\u4EF6
7352
8487
  # - name: email
7353
8488
  # type: smtp
7354
8489
  # host: \${HAI_REACH_PROVIDERS_0_HOST:smtp.example.com}
@@ -7361,10 +8496,15 @@ providers:
7361
8496
  # \u963F\u91CC\u4E91\u77ED\u4FE1\uFF08\u6309\u9700\u5F00\u542F\uFF09
7362
8497
  # - name: sms
7363
8498
  # type: aliyun-sms
7364
- # accessKeyId: \${HAI_REACH_PROVIDERS_0_ACCESSKEYID}
7365
- # accessKeySecret: \${HAI_REACH_PROVIDERS_0_ACCESSKEYSECRET}
8499
+ # accessKeyId: \${HAI_REACH_PROVIDERS_1_ACCESSKEYID}
8500
+ # accessKeySecret: \${HAI_REACH_PROVIDERS_1_ACCESSKEYSECRET}
7366
8501
  # signName: MyApp
7367
8502
  # endpoint: dysmsapi.aliyuncs.com
8503
+ # gateway: # \u53EF\u9009\uFF1B\u914D\u7F6E\u540E\u5411\u5B8C\u6574 URL \u53D1\u9001 POST
8504
+ # url: https://sms-gateway.example.com/dx
8505
+ # headers:
8506
+ # X-Gateway-Client: delivery
8507
+ # body: {}
7368
8508
 
7369
8509
  # \u901A\u7528 API\uFF08\u6309\u9700\u5F00\u542F\uFF1B\u53EF\u5BF9\u63A5\u5E94\u7528\u81EA\u6709\u6295\u9012\u670D\u52A1\uFF09
7370
8510
  # - name: custom
@@ -7372,7 +8512,7 @@ providers:
7372
8512
  # url: https://notify.example.com/send
7373
8513
  # method: POST # POST | PUT
7374
8514
  # headers:
7375
- # Authorization: 'Bearer \${HAI_REACH_PROVIDERS_0_HEADERS_AUTHORIZATION}'
8515
+ # Authorization: 'Bearer \${HAI_REACH_PROVIDERS_2_HEADERS_AUTHORIZATION}'
7376
8516
  # timeout: 10000
7377
8517
  # redirect: error # \u666E\u901A\u6D88\u606F\u624D\u53EF\u663E\u5F0F follow\uFF1B\u654F\u611F\u53D1\u9001\u59CB\u7EC8\u62D2\u7EDD\u8DF3\u8F6C\u3002
7378
8518
  # requireHttps: true # \u5F3A\u5236 HTTPS\uFF1B\u7701\u7565\u65F6\u751F\u4EA7\u654F\u611F\u53D1\u9001\u4ECD\u8981\u6C42 HTTPS\u3002
@@ -7403,7 +8543,8 @@ templates: []
7403
8543
  # start: "22:00"
7404
8544
  # end: "08:00"
7405
8545
 
7406
- # \u5EF6\u8FDF\u961F\u5217\u91CD\u8BD5\u7B56\u7565\uFF08\u5165\u961F\u65F6\u6301\u4E45\u4FDD\u5B58\uFF1B\u9886\u53D6/\u5D29\u6E83\u6062\u590D\u8BA1\u6570\uFF0C\u8D85\u9650 dead\uFF1Bunknown \u7981\u6B62\u81EA\u52A8\u91CD\u53D1\uFF09
8546
+ # \u53D1\u9001\u5931\u8D25\u65F6\u6700\u591A\u5C1D\u8BD5 5 \u6B21\uFF1B\u7B49\u5F85\u65F6\u95F4\u4ECE 1 \u5206\u949F\u9010\u6B21\u52A0\u500D\uFF0C\u6700\u957F 1 \u5C0F\u65F6\u3002
8547
+ # \u65E0\u6CD5\u786E\u8BA4\u5BF9\u65B9\u662F\u5426\u6536\u5230\u65F6\u505C\u6B62\u81EA\u52A8\u91CD\u53D1\uFF0C\u5148\u6838\u5BF9\u6295\u9012\u7ED3\u679C\u3002\u4FEE\u6539\u7B56\u7565\u53EA\u5F71\u54CD\u4EE5\u540E\u8FDB\u5165\u961F\u5217\u7684\u6D88\u606F\u3002
7407
8548
  queue:
7408
8549
  maxAttempts: \${HAI_REACH_QUEUE_MAXATTEMPTS:5}
7409
8550
  retryDelayMs: \${HAI_REACH_QUEUE_RETRYDELAYMS:60000}
@@ -7436,7 +8577,7 @@ function generateAuditConfig() {
7436
8577
  # \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E (@h-ai/audit)
7437
8578
  # =============================================================================
7438
8579
 
7439
- # \u7528\u6237\u8868\u540D\uFF08\u7528\u4E8E JOIN \u67E5\u8BE2\uFF09
8580
+ # \u5BA1\u8BA1\u5217\u8868\u67E5\u8BE2\u64CD\u4F5C\u8005\u540D\u79F0\u65F6\u4F7F\u7528\u7684\u7528\u6237\u8868\u3002\u4F7F\u7528\u6846\u67B6 IAM \u65F6\u4FDD\u6301\u4E0B\u9762\u4E09\u4E2A\u9ED8\u8BA4\u503C\u3002
7440
8581
  userTable: hai_iam_users
7441
8582
 
7442
8583
  # \u7528\u6237\u8868\u4E3B\u952E\u5217\u540D
@@ -7445,22 +8586,27 @@ userIdColumn: id
7445
8586
  # \u7528\u6237\u540D\u5217\u540D
7446
8587
  userNameColumn: username
7447
8588
 
7448
- # \u6846\u67B6\u81EA\u52A8\u4E8B\u4EF6\u91C7\u96C6\uFF1B\u663E\u5F0F\u4E1A\u52A1 audit.log \u4E0D\u53D7\u6B64\u5F00\u5173\u5F71\u54CD
8589
+ # \u81EA\u52A8\u8BB0\u5F55\u5DF2\u63A5\u5165\u6846\u67B6\u7684\u91CD\u8981\u64CD\u4F5C\uFF1BincludeReads=true \u65F6\u4E5F\u8BB0\u5F55\u6210\u529F\u67E5\u8BE2\uFF0C\u4F1A\u589E\u52A0\u8BB0\u5F55\u91CF\u3002
8590
+ # enabled=false \u53EA\u5173\u95ED\u81EA\u52A8\u91C7\u96C6\uFF0C\u4E1A\u52A1\u4E3B\u52A8\u8C03\u7528 audit.log() \u4ECD\u53EF\u5199\u5165\u3002
7449
8591
  capture:
7450
8592
  enabled: true
7451
8593
  includeReads: false
7452
8594
 
7453
- # \u5E94\u7528\u793A\u4F8B\u4FDD\u62A4\u8FD1\u671F\u65E5\u5FD7\uFF1B\u6846\u67B6\u672A\u914D\u7F6E\u65F6\u4E0D\u5F3A\u5236\u542F\u7528\u30020\u5929\u6E05\u7406\u4E0D\u80FD\u7ED5\u8FC7\u5DF2\u542F\u7528\u4FDD\u62A4\u3002
8595
+ # enabled=true \u540E\uFF0C\u6700\u8FD1 minDays \u5929\u7684\u8BB0\u5F55\u4E0D\u80FD\u4FEE\u6539\u6216\u5220\u9664\uFF1B\u8D85\u8FC7\u4FDD\u62A4\u671F\u4E5F\u4E0D\u4F1A\u81EA\u52A8\u5220\u9664\u3002
8596
+ # \u4FDD\u62A4\u8BBE\u7F6E\u4F1A\u5B58\u5165\u6570\u636E\u5E93\uFF0C\u5220\u6389\u8FD9\u4E00\u6BB5\u4F1A\u6CBF\u7528\u5DF2\u6709\u8BBE\u7F6E\uFF1B\u660E\u786E enabled=false \u624D\u5173\u95ED\u4FDD\u62A4\u3002
7454
8597
  retention:
7455
8598
  enabled: false
7456
8599
  minDays: 90
7457
8600
 
7458
- # \u51ED\u636E\u59CB\u7EC8\u8131\u654F\uFF1B\u4EC5\u4E1A\u52A1\u9690\u79C1\u53EF\u5173\u95ED\uFF0C\u53EF\u8865\u5145\u9879\u76EE\u5B57\u6BB5\u540D
8601
+ # fields \u586B\u989D\u5916\u7684\u9690\u79C1\u5B57\u6BB5\u540D\uFF0C\u4F8B\u5982 [customerPhone, idCard]\uFF0C\u4E0D\u533A\u5206\u5927\u5C0F\u5199\u3002
8602
+ # \u5BC6\u7801\u3001\u4EE4\u724C\u7B49\u51ED\u636E\u59CB\u7EC8\u906E\u76D6\uFF1Benabled \u53EA\u63A7\u5236\u8FD9\u91CC\u8865\u5145\u7684\u4E1A\u52A1\u5B57\u6BB5\uFF0C\u4E0D\u6062\u590D\u5386\u53F2\u539F\u6587\u3002
7459
8603
  privacy:
7460
8604
  enabled: true
7461
8605
  fields: []
7462
8606
 
7463
- # \u79C1\u6709 JSONL \u5F52\u6863\uFF1B\u751F\u4EA7\u4F7F\u7528\u79C1\u6709\u5B58\u50A8\uFF0C\u5B9A\u65F6\u6267\u884C\u7531\u5E94\u7528\u73B0\u6709 Scheduler \u88C5\u914D\u3002
8607
+ # \u5C06\u5BA1\u8BA1\u53E6\u5B58\u4E3A\u79C1\u6709 JSONL \u5907\u4EFD\uFF0C\u542F\u7528\u524D\u5148\u521D\u59CB\u5316\u79C1\u6709 Storage\u3002
8608
+ # batchSize \u662F\u6BCF\u6279\u8BFB\u53D6\u6761\u6570\uFF1BmaxRecordBytes \u662F\u5355\u6761\u4E0A\u9650\uFF08\u5B57\u8282\uFF09\uFF0C\u8D85\u9650\u62A5\u9519\uFF0C\u4E0D\u622A\u65AD\u8BB0\u5F55\u3002
8609
+ # schedule.enabled=true \u6309 cron \u81EA\u52A8\u5907\u4EFD\uFF1B\u4F8B\u5982 UTC 02:00 \u5BF9\u5E94\u5317\u4EAC\u65F6\u95F4 10:00\u3002
7464
8610
  backup:
7465
8611
  enabled: false
7466
8612
  batchSize: 200
@@ -7470,18 +8616,21 @@ backup:
7470
8616
  cron: '0 2 * * *'
7471
8617
  timezone: UTC
7472
8618
 
7473
- # \u5206\u7EA7\u9608\u503C\u544A\u8B66\uFF1A\u542F\u7528\u524D\u914D\u7F6E\u89C4\u5219\u53CA Reach \u901A\u77E5\u76EE\u6807\u3002\u53EA\u7EDF\u8BA1\u5DF2\u63D0\u4EA4\u4E8B\u4EF6\u3002
8619
+ # \u6309\u4E00\u6BB5\u65F6\u95F4\u5185\u7684\u4E8B\u4EF6\u6570\u91CF\u901A\u77E5\u7BA1\u7406\u5458\uFF1B\u542F\u7528\u524D\u914D\u7F6E Reach\uFF0C\u5E76\u5C06 provider \u586B\u4E3A\u5DF2\u6CE8\u518C\u7684\u901A\u9053\u540D\u79F0\u3002
8620
+ # \u4F8B\u5B50\uFF1A5 \u5206\u949F\u5185\u767B\u5F55\u5931\u8D25/\u62D2\u7EDD\u8FBE\u5230 10 \u6B21\u65F6\u901A\u77E5\u5B89\u5168\u56E2\u961F\uFF1B\u89C4\u5219\u548C\u5B9A\u65F6\u68C0\u67E5\u9700\u8981\u5206\u522B\u542F\u7528\u3002
7474
8621
  alerts:
7475
8622
  enabled: false
7476
8623
  maxNotificationsPerCheck: 100
7477
8624
  rules: []
7478
- # - id: login-failures
7479
- # actions: [auth.login]
7480
- # outcomes: [failure, denied]
7481
- # threshold: 10
7482
- # windowSeconds: 300
7483
- # severity: warning
7484
- # targets: [{ id: security-team, provider: email, to: security@example.com }]
8625
+ # \u7528\u4E0B\u9762\u7684 rules \u5217\u8868\u66FF\u6362\u7A7A\u6570\u7EC4\u3002
8626
+ # rules:
8627
+ # - id: login-failures
8628
+ # actions: [auth.login]
8629
+ # outcomes: [failure, denied]
8630
+ # threshold: 10
8631
+ # windowSeconds: 300
8632
+ # severity: warning
8633
+ # targets: [{ id: security-team, provider: email, to: security@example.com }]
7485
8634
  schedule:
7486
8635
  enabled: false
7487
8636
  cron: '* * * * *'
@@ -7552,6 +8701,6 @@ envAllowlist:
7552
8701
  `;
7553
8702
  }
7554
8703
 
7555
- export { generateConfigFile, generateEnvExample, generateProductionEnvironment, moduleEnvironmentVariables, parameterizeConfig, renderEnvironment, runtimeEnvironmentVariables };
7556
- //# sourceMappingURL=chunk-EF7WOFWZ.js.map
7557
- //# sourceMappingURL=chunk-EF7WOFWZ.js.map
8704
+ export { documentConfig, generateConfigFile, generateEnvExample, generateProductionEnvironment, moduleEnvironmentVariables, parameterizeConfig, renderEnvironment, runtimeEnvironmentVariables };
8705
+ //# sourceMappingURL=chunk-L53P43B2.js.map
8706
+ //# sourceMappingURL=chunk-L53P43B2.js.map