@h-ai/cli 0.1.0-alpha.64 → 0.1.0-alpha.65

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 (102) hide show
  1. package/README.en.md +20 -4
  2. package/README.ja.md +20 -4
  3. package/README.md +28 -12
  4. package/dist/chunk-47V5OT22.js +5639 -0
  5. package/dist/chunk-47V5OT22.js.map +1 -0
  6. package/dist/{chunk-X3RSYNBG.js → chunk-IPG3QNYK.js} +62 -4
  7. package/dist/chunk-IPG3QNYK.js.map +1 -0
  8. package/dist/cli-config-templates-SJ2MBIR7.js +5 -0
  9. package/dist/{cli-config-templates-QRF6B5T4.js.map → cli-config-templates-SJ2MBIR7.js.map} +1 -1
  10. package/dist/{cli-skill-templates-EZFW7D43.js → cli-skill-templates-A5VIR5J6.js} +3 -3
  11. package/dist/{cli-skill-templates-EZFW7D43.js.map → cli-skill-templates-A5VIR5J6.js.map} +1 -1
  12. package/dist/index.js +524 -66
  13. package/dist/index.js.map +1 -1
  14. package/dist/{src-DUGLX4YB.js → src-6PPBKQ6Q.js} +666 -290
  15. package/dist/src-6PPBKQ6Q.js.map +1 -0
  16. package/package.json +9 -7
  17. package/templates/apps/admin/src/routes/+layout.svelte.hbs +4 -2
  18. package/templates/apps/api/.dockerignore.hbs +5 -0
  19. package/templates/apps/api/.gitignore.hbs +4 -4
  20. package/templates/apps/api/Dockerfile.hbs +11 -1
  21. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +2 -0
  22. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +2 -2
  23. package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +4 -4
  24. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +9 -2
  25. package/templates/apps/api/package.json.hbs +9 -0
  26. package/templates/apps/fullstack/.dockerignore.hbs +5 -3
  27. package/templates/apps/fullstack/.gitignore.hbs +22 -9
  28. package/templates/apps/fullstack/Dockerfile.hbs +11 -1
  29. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +6 -0
  30. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +7 -3
  31. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -0
  32. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +7 -3
  33. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +6 -0
  34. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +7 -3
  35. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +23 -1
  36. package/templates/apps/fullstack/package.json.hbs +12 -0
  37. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -2
  38. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +2 -0
  39. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +1 -1
  40. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +8 -14
  41. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +6 -4
  42. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +8 -8
  43. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +3 -3
  44. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +9 -2
  45. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +4 -4
  46. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +3 -1
  47. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +2 -0
  48. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +14 -12
  49. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +1 -1
  50. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +17 -3
  51. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +15 -5
  52. package/templates/apps/fullstack/playwright.config.ts.hbs +6 -1
  53. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +0 -1
  54. package/templates/apps/h5/src/routes/+layout.svelte.hbs +13 -13
  55. package/templates/apps/mobile-app/src/App.svelte.hbs +46 -117
  56. package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +58 -0
  57. package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -0
  58. package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +16 -0
  59. package/templates/base/.dockerignore.hbs +5 -0
  60. package/templates/base/.gitignore.hbs +18 -4
  61. package/templates/base/Dockerfile.hbs +17 -1
  62. package/templates/base/e2e/app.spec.ts.hbs +14 -0
  63. package/templates/base/package.json.hbs +14 -2
  64. package/templates/base/tests/scaffold.test.ts.hbs +9 -3
  65. package/templates/base/vite.config.ts.hbs +6 -4
  66. package/templates/shared/hash-router.svelte.ts +83 -0
  67. package/templates/skills/AGENTS.md +15 -1
  68. package/templates/skills/bridges/admin/AGENTS.md +17 -1
  69. package/templates/skills/bridges/api/AGENTS.md +17 -3
  70. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +35 -11
  71. package/templates/skills/bridges/h5/AGENTS.md +17 -1
  72. package/templates/skills/bridges/mobile-app/AGENTS.md +19 -3
  73. package/templates/skills/bridges/website/AGENTS.md +17 -1
  74. package/templates/skills/hai-ai/reference.md +2 -2
  75. package/templates/skills/hai-app-create/SKILL.md +5 -3
  76. package/templates/skills/hai-app-create/development.md +126 -2
  77. package/templates/skills/hai-app-create/reference.md +2 -2
  78. package/templates/skills/hai-app-review/SKILL.md +2 -2
  79. package/templates/skills/hai-app-tests/SKILL.md +2 -1
  80. package/templates/skills/hai-app-tests/reference.md +1 -1
  81. package/templates/skills/hai-core/SKILL.md +2 -1
  82. package/templates/skills/hai-deploy/SKILL.md +42 -34
  83. package/templates/skills/hai-deploy/middleware.md +94 -0
  84. package/templates/skills/hai-framework-sync/SKILL.md +1 -1
  85. package/templates/skills/hai-framework-sync/sync.md +1 -1
  86. package/templates/skills/hai-reach/reference.md +8 -8
  87. package/templates/skills/hai-spec-implement/SKILL.md +12 -9
  88. package/templates/skills/hai-spec-implement/changes.md +67 -0
  89. package/templates/skills/hai-spec-implement/templates.md +25 -3
  90. package/templates/skills/hai-spec-implement/workflow.md +7 -6
  91. package/templates/skills/hai-spec-review/SKILL.md +14 -5
  92. package/templates/skills/hai-spec-review/checklist.md +4 -3
  93. package/templates/skills/hai-storage/SKILL.md +2 -0
  94. package/dist/chunk-WW2MIO6T.js +0 -992
  95. package/dist/chunk-WW2MIO6T.js.map +0 -1
  96. package/dist/chunk-X3RSYNBG.js.map +0 -1
  97. package/dist/cli-config-templates-QRF6B5T4.js +0 -5
  98. package/dist/src-DUGLX4YB.js.map +0 -1
  99. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/AuditManagement.svelte.hbs → pages/audit.svelte.hbs} +0 -0
  100. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/RoleManagement.svelte.hbs → pages/roles.svelte.hbs} +0 -0
  101. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/ProfileSettings.svelte.hbs → pages/settings.svelte.hbs} +0 -0
  102. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/UserManagement.svelte.hbs → pages/users.svelte.hbs} +0 -0
@@ -1,992 +0,0 @@
1
- #!/usr/bin/env node
2
- import { stringify } from 'yaml';
3
-
4
- function generateConfigFile(moduleKey, configs) {
5
- switch (moduleKey) {
6
- case "core":
7
- return generateCoreConfig(configs?.core);
8
- case "serv":
9
- return generateServConfig();
10
- case "db":
11
- return generateDbConfig(configs?.db);
12
- case "cache":
13
- return generateCacheConfig(configs?.cache);
14
- case "iam":
15
- return generateIamConfig(configs?.iam);
16
- case "storage":
17
- return generateStorageConfig(configs?.storage);
18
- case "ai":
19
- return generateAiConfig(configs?.ai);
20
- case "deploy":
21
- return generateDeployConfig();
22
- case "vecdb":
23
- return generateVecdbConfig();
24
- case "reach":
25
- return generateReachConfig();
26
- case "scheduler":
27
- return generateSchedulerConfig();
28
- case "audit":
29
- return generateAuditConfig();
30
- case "payment":
31
- return generatePaymentConfig();
32
- default:
33
- return `# ${moduleKey} \u914D\u7F6E
34
- `;
35
- }
36
- }
37
- function generateCoreConfig(cfg) {
38
- const name = cfg?.name ?? "my-app";
39
- const locale = cfg?.defaultLocale ?? "zh-CN";
40
- return `# =============================================================================
41
- # \u5E94\u7528\u914D\u7F6E
42
- # =============================================================================
43
-
44
- ${stringify({ name }).trim()}
45
- version: 0.1.0
46
- env: development
47
- debug: false
48
-
49
- logging:
50
- level: info
51
- format: json
52
- # context:
53
- # service: api
54
- redact:
55
- - password
56
- - token
57
- - secret
58
-
59
- defaultLocale: ${locale}
60
- # \u77ED ID \u751F\u6210\u9009\u9879\uFF1B\u8BED\u8A00\u5217\u8868\u5728\u524D\u7AEF project.inlang/settings.json \u4E2D\u7EF4\u62A4\u3002
61
- # id:
62
- # prefix: app_
63
- # length: 21
64
- `;
65
- }
66
- function generateServConfig() {
67
- return `# =============================================================================
68
- # Service / HTTP \u5165\u53E3\u914D\u7F6E
69
- # =============================================================================
70
-
71
- server:
72
- host: 127.0.0.1
73
- port: 3000
74
-
75
- http:
76
- apiPrefix: /api/v1
77
- openapi:
78
- path: /openapi.json
79
- docs:
80
- path: /docs
81
- # requireAuth: true
82
- health:
83
- path: /health
84
- readyPath: /ready
85
- rpc: false
86
- # \u542F\u7528\u5185\u90E8 RPC \u65F6\u7528\u5BF9\u8C61\u66FF\u6362 false\uFF0Cgateway-only \u5FC5\u987B\u914D\u7F6E\u7F51\u5173\u5BC6\u94A5\u3002
87
- # rpc:
88
- # prefix: /api/rpc
89
- # access: gateway-only # loopback | private-network | gateway-only
90
- # gatewayHeader: X-Gateway-Key
91
- # gatewaySecret: \${HAI_SERV_HTTP_RPC_GATEWAYSECRET}
92
-
93
- # \u6309\u9700\u5F00\u542F\u8DE8\u57DF\u8BBF\u95EE\uFF0C\u751F\u4EA7\u73AF\u5883\u586B\u5199\u660E\u786E\u7684 Origin\u3002
94
- # cors:
95
- # origin: https://app.example.com
96
- # nativeOrigins: capacitor://localhost,tauri://localhost
97
- # allowedHeaders: [Authorization, Content-Type, X-Request-Id]
98
- # exposedHeaders: [X-Request-Id]
99
- # credentials: true
100
-
101
- # \u5F00\u53D1\u671F\u9ED8\u8BA4\u5173\u95ED transport\uFF1B\u542F\u7528 @h-ai/crypto \u540E\u53EF\u6309\u9700\u6539\u4E3A\u5BF9\u8C61\u914D\u7F6E
102
- transport: false
103
- # transport:
104
- # keyExchangePath: /_hai/key-exchange
105
- # excludePaths: [/health, /ready]
106
- # maxClients: 10000
107
- `;
108
- }
109
- function generateDbConfig(cfg) {
110
- const dbType = cfg?.type ?? "sqlite";
111
- const database = cfg?.database ?? (dbType === "sqlite" ? "./data/app.db" : "hai");
112
- const host = cfg?.host ?? "localhost";
113
- const port = cfg?.port ?? (dbType === "postgresql" ? 5432 : 3306);
114
- const user = dbType === "postgresql" ? "postgres" : "root";
115
- const connection = stringify({ host, port, user, password: "" }).trim();
116
- const networkOptions = `# url: \${HAI_DB_URL} # \u53EF\u7528\u8FDE\u63A5\u4E32\u66FF\u4EE3 host/port/user/password
117
- # ssl: false # false | true | require | prefer | allow | disable\uFF0C\u6216 TLS \u5BF9\u8C61
118
- # pool:
119
- # min: 1
120
- # max: 10
121
- # idleTimeout: 30000
122
- # acquireTimeout: 10000
123
- # MySQL \u4E13\u7528\uFF1BPostgreSQL \u65E0\u9700\u6B64\u5757\u3002
124
- # mysql:
125
- # charset: utf8mb4
126
- # timezone: '+08:00'`;
127
- return `# =============================================================================
128
- # \u6570\u636E\u5E93\u914D\u7F6E
129
- # =============================================================================
130
-
131
- # \u6570\u636E\u5E93\u7C7B\u578B: sqlite | postgresql | mysql
132
- type: ${dbType}
133
-
134
- # SQLite \u4F7F\u7528\u6587\u4EF6\u8DEF\u5F84\uFF0CPostgreSQL/MySQL \u4F7F\u7528\u6570\u636E\u5E93\u540D\u79F0\u3002
135
- ${stringify({ database }).trim()}
136
-
137
- ${dbType === "sqlite" ? `# SQLite \u9A71\u52A8\u9009\u9879\uFF1Bworker \u5C06\u67E5\u8BE2\u79FB\u5230\u5DE5\u4F5C\u7EBF\u7A0B\u3002
138
- # sqlite:
139
- # walMode: true
140
- # readonly: false
141
- # executor: sync # sync | worker
142
- # workerConnectTimeoutMs: 10000
143
-
144
- # \u5207\u6362\u5230 PostgreSQL/MySQL \u65F6\u4FEE\u6539 type\u3001database\uFF0C\u5E76\u53D6\u6D88\u8FDE\u63A5\u9879\u7684\u6CE8\u91CA\u3002
145
- ${stringify({ host: "localhost", port: 5432, user: "postgres", password: "" }).trim().split("\n").map((line) => `# ${line}`).join("\n")}` : `# \u7F51\u7EDC\u6570\u636E\u5E93\u8FDE\u63A5\uFF1B\u51ED\u636E\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u6CE8\u5165\u3002
146
- ${connection}
147
- # SQLite \u66FF\u4EE3\u65B9\u6848\uFF1Atype: sqlite\uFF0Cdatabase: ./data/app.db
148
- # sqlite:
149
- # walMode: true
150
- # readonly: false
151
- # executor: sync
152
- # workerConnectTimeoutMs: 10000`}
153
- ${networkOptions}
154
-
155
- # SQL \u65E5\u5FD7\u6309\u9700\u5F00\u542F\uFF1BmaxLength \u9650\u5236 SQL / \u53C2\u6570\u8F93\u51FA\u957F\u5EA6\u3002
156
- # operationLog:
157
- # read: false
158
- # write: false
159
- # maxLength: 1000
160
- # level: debug # trace | debug | info
161
- `;
162
- }
163
- function generateCacheConfig(cfg) {
164
- const cacheType = cfg?.type ?? "memory";
165
- const host = cfg?.host ?? "localhost";
166
- const port = cfg?.port ?? 6379;
167
- const connection = stringify({ host, port, password: "", keyPrefix: "hai:" }).trim();
168
- return `# =============================================================================
169
- # \u7F13\u5B58\u914D\u7F6E
170
- # =============================================================================
171
-
172
- # \u7F13\u5B58\u7C7B\u578B: memory | redis
173
- type: ${cacheType}
174
-
175
- # Redis \u914D\u7F6E\uFF1Bmemory \u65F6\u5747\u4E0D\u751F\u6548\uFF0C\u5207\u6362 type \u540E\u53D6\u6D88\u9700\u8981\u7684\u6CE8\u91CA\u3002
176
- ${cacheType === "redis" ? connection : connection.split("\n").map((line) => `# ${line}`).join("\n")}
177
- # url: redis://localhost:6379/0
178
- # db: 0
179
- # connectTimeout: 10000
180
- # commandTimeout: 5000
181
- # tls: false
182
- # maxRetries: 3
183
- # retryDelay: 50
184
- # readOnly: false
185
- # \u96C6\u7FA4\u4E0E Sentinel \u4E8C\u9009\u4E00\uFF1B\u666E\u901A Redis \u4E0D\u9700\u8981\u8FD9\u4E24\u5757\u3002
186
- # cluster:
187
- # - host: redis-1.internal
188
- # port: 6379
189
- # - host: redis-2.internal
190
- # port: 6379
191
- # sentinel:
192
- # sentinels:
193
- # - host: sentinel.internal
194
- # port: 26379
195
- # name: mymaster
196
- `;
197
- }
198
- function generateIamConfig(cfg) {
199
- const loginPassword = cfg?.loginPassword ?? true;
200
- const loginOtp = cfg?.loginOtp ?? false;
201
- return `# =============================================================================
202
- # IAM \u914D\u7F6E
203
- # =============================================================================
204
-
205
- # \u767B\u5F55\u914D\u7F6E
206
- login:
207
- password: ${loginPassword}
208
- otp: ${loginOtp}
209
- ldap: false
210
- apikey: false
211
-
212
- # \u6CE8\u518C\u4E0E\u767B\u5F55\u5B89\u5168
213
- register:
214
- enabled: true
215
- defaultEnabled: true
216
- security:
217
- maxLoginAttempts: 5
218
- lockoutDuration: 900
219
-
220
- # LDAP \u53EF\u9009\uFF1A\u5B89\u88C5 ldapts \u540E\u5F00\u542F login.ldap\uFF1B\u4E5F\u53EF\u5728 iam.init \u4E2D\u6CE8\u5165 ldapClientFactory\u3002
221
- # ldap:
222
- # url: ldaps://ldap.example.com:636
223
- # bindDn: cn=service,dc=example,dc=com
224
- # bindPassword: \${HAI_IAM_LDAP_BINDPASSWORD}
225
- # searchBase: ou=users,dc=example,dc=com
226
- # searchFilter: '(uid={{username}})'
227
- # usernameAttribute: uid
228
- # emailAttribute: mail
229
- # displayNameAttribute: cn
230
- # useTls: false # ldap:// \u8FDE\u63A5\u53EF\u5F00\u542F STARTTLS\uFF1Bldaps:// \u5DF2\u4F7F\u7528 TLS
231
- # connectTimeout: 5000
232
- # API Key \u767B\u5F55\u53EF\u9009\uFF1B\u5BC6\u94A5\u7BA1\u7406\u5165\u53E3\u7531\u5E94\u7528\u6309\u6743\u9650\u63A5\u5165\u3002
233
- # apikey:
234
- # maxKeysPerUser: 10
235
- # defaultExpirationDays: 0 # 0 \u8868\u793A\u4E0D\u9650\u5236\u6709\u6548\u671F
236
- # prefix: hai_
237
- # OTP \u9700\u542F\u7528 login.otp\uFF0C\u5E76\u9009\u62E9 Reach \u6807\u51C6\u6A21\u677F\u6216\u81EA\u5B9A\u4E49\u53D1\u9001\u56DE\u8C03\u3002
238
- ${(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:
239
- email: true
240
- sms: true
241
- length: 6
242
- expiresIn: 300
243
- maxAttempts: 3
244
- resendInterval: 60`.split("\n").map((line) => loginOtp ? line : `# ${line}`).join("\n")}
245
- passwordReset:
246
- enabled: true
247
- mode: email # phone \u4F7F\u7528 password_reset_sms \u6A21\u677F
248
- tokenExpiresIn: 3600
249
- maxAttempts: 3
250
- # resetUrl: https://example.com/auth/reset-password
251
- agreements:
252
- showOnRegister: true
253
- showOnLogin: false
254
- # \u7528 | \u914D\u7F6E Markdown \u6B63\u6587\uFF1B\u540C\u4E3B\u9898\u540C\u65F6\u63D0\u4F9B URL \u65F6\u4F18\u5148\u663E\u793A\u6B63\u6587\u3002
255
- userAgreementMarkdown: |
256
- # \u7528\u6237\u534F\u8BAE\u793A\u4F8B
257
-
258
- \u8BF7\u59A5\u5584\u4FDD\u7BA1\u8D26\u6237\u51ED\u636E\uFF0C\u5E76\u6309\u5E94\u7528\u63D0\u4F9B\u7684\u529F\u80FD\u4F7F\u7528\u670D\u52A1\u3002
259
- privacyPolicyMarkdown: |
260
- # \u9690\u79C1\u653F\u7B56\u793A\u4F8B
261
-
262
- \u6CE8\u518C\u8D44\u6599\u7528\u4E8E\u8D26\u6237\u7BA1\u7406\uFF0C\u4F1A\u8BDD\u4FE1\u606F\u7528\u4E8E\u8EAB\u4EFD\u8BA4\u8BC1\u3002
263
- # userAgreementUrl: https://example.com/terms
264
- # privacyPolicyUrl: https://example.com/privacy
265
- ui:
266
- variant: card
267
- # title: Account center
268
- # subtitle: Welcome back
269
- # brandTitle: Your application
270
- # brandText: Sign in securely
271
- # logoUrl: /logo.svg
272
- # illustrationUrl: /auth-illustration.svg
273
-
274
- # \u5BC6\u7801\u7B56\u7565
275
- password:
276
- minLength: 8
277
- maxLength: 128
278
- requireUppercase: false
279
- requireLowercase: false
280
- requireNumber: false
281
- requireSpecialChar: false
282
- expirationDays: 0 # 0 \u8868\u793A\u4E0D\u9650\u5236\u5BC6\u7801\u6709\u6548\u671F
283
-
284
- # \u4F1A\u8BDD\u914D\u7F6E
285
- session:
286
- maxAge: 86400 # \u4F1A\u8BDD\u8D85\u65F6\uFF08\u79D2\uFF09\uFF0C\u9ED8\u8BA4 24 \u5C0F\u65F6
287
- sliding: true # \u6ED1\u52A8\u7A97\u53E3\uFF08\u6BCF\u6B21\u8BF7\u6C42\u5237\u65B0\u8FC7\u671F\u65F6\u95F4\uFF09
288
- singleDevice: false # \u5355\u8BBE\u5907\u767B\u5F55
289
- refreshTokenMaxAge: 604800 # refreshToken \u8FC7\u671F\uFF08\u79D2\uFF09\uFF0C\u9ED8\u8BA4 7 \u5929
290
-
291
- # RBAC \u914D\u7F6E
292
- rbac:
293
- enabled: true
294
- superAdminRole: super_admin
295
- defaultRole: user
296
-
297
- # \u662F\u5426\u81EA\u52A8\u521B\u5EFA\u9ED8\u8BA4\u6570\u636E
298
- seedDefaultData: true
299
- `;
300
- }
301
- function generateStorageConfig(cfg) {
302
- const type = cfg?.type ?? "local";
303
- const local = `${stringify({ root: cfg?.localPath ?? "./data/uploads" }).trim()}
304
- # directoryMode: 493 # 0o755
305
- # fileMode: 420 # 0o644`;
306
- const s3 = `bucket: ''
307
- region: us-east-1
308
- accessKeyId: ''
309
- secretAccessKey: ''
310
- # endpoint: https://s3.amazonaws.com
311
- # forcePathStyle: false
312
- # prefix: ''
313
- # publicUrl: https://cdn.example.com`;
314
- return `# \u5B58\u50A8\u914D\u7F6E\uFF1BHAI_STORAGE \u53EF\u6574\u4F53\u66FF\u6362\u8FDE\u63A5\u914D\u7F6E\u3002
315
- type: ${type}
316
- ${type === "local" ? local : s3}
317
-
318
- # \u5207\u6362 type \u540E\u4F7F\u7528\u53E6\u4E00\u79CD\u5B58\u50A8\u7684\u8FDE\u63A5\u9879\u3002
319
- ${(type === "local" ? s3 : local).split("\n").map((line) => line.startsWith("#") ? line : `# ${line}`).join("\n")}
320
-
321
- # operationLog:
322
- # read: false
323
- # write: false
324
- # maxLength: 1000
325
- # level: debug # trace | debug | info
326
- `;
327
- }
328
- function generateAiConfig(cfg) {
329
- const model = cfg?.model ?? "gpt-4o-mini";
330
- const api = cfg?.defaultProvider === "anthropic" ? "anthropic" : "chat";
331
- return `# =============================================================================
332
- # AI \u914D\u7F6E
333
- # =============================================================================
334
-
335
- # LLM \u914D\u7F6E\uFF08\u5FC5\u586B\uFF09
336
- llm:
337
- # API Key\uFF08\u7EA6\u5B9A\u73AF\u5883\u53D8\u91CF HAI_AI_LLM_APIKEY \u4F18\u5148\uFF09
338
- apiKey: ''
339
- # Base URL\uFF08\u7EA6\u5B9A\u73AF\u5883\u53D8\u91CF HAI_AI_LLM_BASEURL \u4F18\u5148\uFF09
340
- # baseUrl: https://api.openai.com/v1
341
- # \u9ED8\u8BA4\u6A21\u578B
342
- ${stringify({ model }).trim().split("\n").map((line) => ` ${line}`).join("\n")}
343
- api: ${api} # chat | responses | anthropic
344
- # \u5168\u5C40\u6700\u5927 Token \u6570\uFF08\u9ED8\u8BA4 4096\uFF09
345
- # maxTokens: 4096
346
- # \u91C7\u6837\u6E29\u5EA6\uFF080-2\uFF0C\u9ED8\u8BA4 0.7\uFF09
347
- # temperature: 0.7
348
- # \u8BF7\u6C42\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 60000\uFF09
349
- # timeout: 60000
350
- # tempModelCacheTtl: 600000
351
-
352
- # \u591A\u6A21\u578B\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u573A\u666F\u8DEF\u7531\uFF09
353
- # models:
354
- # - id: fast
355
- # model: gpt-4o-mini
356
- # api: chat
357
- # apiKey: ''
358
- # baseUrl: https://api.openai.com/v1
359
- # maxTokens: 4096
360
- # temperature: 0.7
361
- # timeout: 60000
362
- # - id: smart
363
- # model: gpt-4o
364
- # apiKey: ''
365
-
366
- # \u573A\u666F\u6A21\u578B\u6620\u5C04\uFF08\u53EF\u9009\uFF09
367
- # scenarios:
368
- # default: fast
369
- # chat: fast
370
- # reasoning: smart
371
- # plan: smart
372
- # execute: fast
373
- # extraction: fast
374
- # summary: fast
375
- # embedding: embedding
376
- # rerank: rerank
377
- # ocr: vision
378
- # fast: fast
379
- # 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
380
-
381
- # \u53EF\u9009\u5B50\u6A21\u5757\uFF1A\u53EA\u53D6\u6D88\u9700\u8981\u7684\u5757\u7684\u6CE8\u91CA\uFF0C\u6A21\u578B\u3001\u5411\u91CF\u5E93\u4E0E\u6570\u636E\u5E93\u4F9D\u8D56\u6309\u4F7F\u7528\u573A\u666F\u521D\u59CB\u5316\u3002
382
- # mcp:
383
- # server:
384
- # name: my-app
385
- # version: 1.0.0
386
- # capabilities:
387
- # tools: true
388
- # resources: true
389
- # prompts: true
390
- # embedding:
391
- # dimensions: 1536
392
- # batchSize: 100
393
- # knowledge:
394
- # collection: hai_ai_knowledge
395
- # dimension: 1536
396
- # enableEntityExtraction: true
397
- # entityBoostWeight: 0.15
398
- # entityTypes: [person, organization, location]
399
- # systemPrompt: 'Extract entities from the input.'
400
- # cleanOptions:
401
- # removeHtml: true
402
- # removeUrls: false
403
- # removeEmails: false
404
- # normalizeWhitespace: true
405
- # trim: true
406
- # customReplacements:
407
- # - pattern: '\\t+'
408
- # replacement: ' '
409
- # chunkOptions:
410
- # mode: markdown # sentence | paragraph | markdown | page | word | character | custom
411
- # maxSize: 1500
412
- # overlap: 200
413
- # separator: '\\n\\n' # \u4EC5 custom \u6A21\u5F0F\u4F7F\u7528
414
- # markdownMinLevel: 2
415
- # markdownKeepTitle: true
416
- # memory:
417
- # provider: native # native | mem0
418
- # allowEphemeralFallback: false
419
- # maxEntriesPerObject: 1000
420
- # maxEntriesGlobal: 100000
421
- # systemPrompt: 'Extract useful memories from the conversation.'
422
- # recencyDecay: 0.95
423
- # embeddingEnabled: true
424
- # defaultTopK: 10
425
- # candidateMultiplier: 5
426
- # writebackRelatedTopK: 20
427
- # token:
428
- # tokenRatio: 0.25
429
- # summary:
430
- # systemPrompt: 'Summarize the conversation.'
431
- # compress:
432
- # defaultStrategy: hybrid # summary | sliding-window | hybrid
433
- # defaultMaxTokens: 0
434
- # preserveLastN: 4
435
- # retrieval:
436
- # sources:
437
- # - id: docs
438
- # collection: documentation
439
- # name: Product documentation
440
- # url: https://docs.example.com
441
- # topK: 5
442
- # minScore: 0.7
443
- # filter:
444
- # published: true
445
- # file:
446
- # systemPrompt: 'Extract text from the image.'
447
- # a2a:
448
- # agentCard:
449
- # name: my-agent
450
- # description: Application agent
451
- # url: https://agent.example.com
452
- # version: 1.0.0
453
- # skills:
454
- # - id: chat
455
- # name: Chat
456
- # description: General conversation
457
- # tags: [chat]
458
- # security:
459
- # apiKey:
460
- # in: header # header | query
461
- # name: x-api-key
462
- # audio:
463
- # inheritLlmApiKey: false
464
- # transcribeModel: asr
465
- # synthesizeModel: tts
466
- # maxAudioBytes: 10485760
467
- # maxStreamDurationMs: 300000
468
- # models:
469
- # - id: asr
470
- # provider: openai # openai | mimo | qwen | doubao | whisper | indextts
471
- # model: whisper-1
472
- # operations: [transcribe]
473
- # apiKey: ''
474
- # baseUrl: https://api.openai.com/v1
475
- # timeout: 60000
476
- # appKey: '' # \u8C46\u5305\u65E7\u7248\u63A7\u5236\u53F0 ASR \u4F7F\u7528
477
- # accessKey: ''
478
- # resourceId: ''
479
- # workspaceId: '' # \u767E\u70BC\u4E1A\u52A1\u7A7A\u95F4
480
- # - id: tts
481
- # provider: openai
482
- # model: tts-1
483
- # operations: [synthesize]
484
- # image:
485
- # generateModel: image
486
- # models:
487
- # - id: image
488
- # provider: openai # openai | google | qwen | seedream | pollinations
489
- # model: gpt-image-1
490
- # apiKey: ''
491
- # baseUrl: https://api.openai.com/v1
492
- # workspaceId: ''
493
- # timeout: 120000
494
- `;
495
- }
496
- function generateEnvExample(features, configs, includeDisabled = false) {
497
- const sections = [];
498
- sections.push(`# =============================================================================
499
- # Environment Variables
500
- # =============================================================================
501
- #
502
- # Copy this file to .env and fill in actual values.
503
- # Config files use literal defaults; matching HAI variables override YAML leaves.
504
- # Uncomment the matching YAML keys before using leaf overrides; HAI_<module> replaces the whole object.
505
- #
506
- # Naming convention: HAI_<config name>_<YAML path>
507
- # =============================================================================`);
508
- sections.push(`
509
- # =============================================================================
510
- # Application
511
- # =============================================================================
512
- # Environment: development | production | test
513
- HAI_CORE_ENV=development
514
- # Enable debug mode
515
- HAI_CORE_DEBUG=false`);
516
- if (features.includes("db") || includeDisabled) {
517
- const dbType = configs?.db?.type ?? "sqlite";
518
- const dbDatabase = configs?.db?.database ?? (dbType === "sqlite" ? "./data/app.db" : "hai");
519
- const isSqlite = dbType === "sqlite";
520
- sections.push(`
521
- # =============================================================================
522
- # Database (@h-ai/reldb)
523
- # =============================================================================
524
- # Database type: sqlite | postgresql | mysql
525
- HAI_DB_TYPE=${dbType}
526
- # SQLite: file path; PostgreSQL/MySQL: database name
527
- HAI_DB_DATABASE=${dbDatabase}${isSqlite ? `
528
- # PostgreSQL/MySQL connection (uncomment when not using sqlite)
529
- # HAI_DB_HOST=localhost
530
- # HAI_DB_PORT=5432
531
- # HAI_DB_USER=postgres
532
- # HAI_DB_PASSWORD=` : `
533
- # Connection
534
- HAI_DB_HOST=${configs?.db?.host ?? "localhost"}
535
- HAI_DB_PORT=${configs?.db?.port ?? (dbType === "postgresql" ? 5432 : 3306)}
536
- HAI_DB_USER=${dbType === "postgresql" ? "postgres" : "root"}
537
- HAI_DB_PASSWORD=`}`);
538
- }
539
- if (features.includes("iam") || includeDisabled) {
540
- sections.push(`
541
- # =============================================================================
542
- # IAM (@h-ai/iam)
543
- # =============================================================================
544
- # HAI_IAM_PASSWORD_MINLENGTH=8
545
- # HAI_IAM_SESSION_MAXAGE=86400
546
- # HAI_IAM_SESSION_REFRESHTOKENMAXAGE=604800
547
- # HAI_IAM_OTP={"email":true,"sms":true,"length":6,"expiresIn":300,"maxAttempts":3,"resendInterval":60}
548
- # HAI_IAM_LDAP_BINDPASSWORD= # Enable login.ldap and uncomment the ldap block first.
549
- # HAI_IAM_PASSWORDRESET_RESETURL=https://app.example.com/auth/reset-password
550
- # HAI_KIT_COOKIE_KEY= # 32-char hex for SM4-CBC cookie encryption
551
- `);
552
- }
553
- if (features.includes("cache") || includeDisabled) {
554
- const cacheType = configs?.cache?.type ?? "memory";
555
- if (cacheType === "redis") {
556
- sections.push(`
557
- # =============================================================================
558
- # Cache (@h-ai/cache)
559
- # =============================================================================
560
- # Cache type: memory | redis
561
- HAI_CACHE_TYPE=redis
562
- # Redis connection
563
- HAI_CACHE_HOST=${configs?.cache?.host ?? "localhost"}
564
- HAI_CACHE_PORT=${configs?.cache?.port ?? 6379}
565
- HAI_CACHE_PASSWORD=
566
- # HAI_CACHE_URL=redis://localhost:6379/0
567
- # HAI_CACHE_DB=0
568
- # HAI_CACHE_CONNECTTIMEOUT=10000
569
- # HAI_CACHE_COMMANDTIMEOUT=5000
570
- # HAI_CACHE_KEYPREFIX=hai:`);
571
- } else {
572
- sections.push(`
573
- # =============================================================================
574
- # Cache (@h-ai/cache)
575
- # =============================================================================
576
- # Cache type: memory | redis
577
- HAI_CACHE_TYPE=memory
578
- # Redis connection (uncomment when type=redis)
579
- # HAI_CACHE_URL=redis://localhost:6379/0
580
- # HAI_CACHE_HOST=localhost
581
- # HAI_CACHE_PORT=6379
582
- # HAI_CACHE_PASSWORD=
583
- # HAI_CACHE_DB=0
584
- # HAI_CACHE_CONNECTTIMEOUT=10000
585
- # HAI_CACHE_COMMANDTIMEOUT=5000
586
- # HAI_CACHE_KEYPREFIX=hai:`);
587
- }
588
- }
589
- if (features.includes("storage") || includeDisabled) {
590
- const storageType = configs?.storage?.type ?? "local";
591
- if (storageType === "s3") {
592
- sections.push(`
593
- # =============================================================================
594
- # Storage (@h-ai/storage)
595
- # =============================================================================
596
- # Default storage provider: local | s3
597
- HAI_STORAGE_TYPE=s3
598
- # S3 / S3-compatible
599
- HAI_STORAGE_BUCKET=
600
- HAI_STORAGE_REGION=us-east-1
601
- HAI_STORAGE_ACCESSKEYID=
602
- HAI_STORAGE_SECRETACCESSKEY=
603
- # HAI_STORAGE_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.
604
- # HAI_STORAGE_FORCEPATHSTYLE=false
605
- # Local storage (uncomment when type=local)
606
- # HAI_STORAGE_ROOT=./data/uploads`);
607
- } else {
608
- sections.push(`
609
- # =============================================================================
610
- # Storage (@h-ai/storage)
611
- # =============================================================================
612
- # Default storage provider: local | s3
613
- HAI_STORAGE_TYPE=local
614
- # Local storage root path
615
- HAI_STORAGE_ROOT=${configs?.storage?.localPath ?? "./data/uploads"}
616
- # S3 / S3-compatible (uncomment when type=s3)
617
- # HAI_STORAGE_BUCKET=
618
- # HAI_STORAGE_REGION=us-east-1
619
- # HAI_STORAGE_ACCESSKEYID=
620
- # HAI_STORAGE_SECRETACCESSKEY=
621
- # HAI_STORAGE_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.
622
- # HAI_STORAGE_FORCEPATHSTYLE=false`);
623
- }
624
- }
625
- if (features.includes("ai") || includeDisabled) {
626
- sections.push(`
627
- # =============================================================================
628
- # AI (@h-ai/ai)
629
- # =============================================================================
630
- # Select chat / responses / anthropic in _ai.yml (llm.api).
631
- HAI_AI_LLM_APIKEY=
632
- # HAI_AI_LLM_BASEURL= # Custom base URL
633
- # Optional compatibility fallback
634
- # OPENAI_API_KEY=`);
635
- }
636
- if (features.includes("vecdb") || includeDisabled) {
637
- sections.push(`
638
- # =============================================================================
639
- # Vector Database (@h-ai/vecdb)
640
- # =============================================================================
641
- # Backend type: lancedb | pgvector | qdrant | chroma
642
- HAI_VECDB_TYPE=lancedb
643
- # LanceDB data path
644
- HAI_VECDB_PATH=./data/vecdb
645
- # Qdrant (uncomment when type=qdrant)
646
- # HAI_VECDB_URL=http://localhost:6333
647
- # HAI_VECDB_APIKEY=
648
- `);
649
- }
650
- if (features.includes("reach") || includeDisabled) {
651
- sections.push(`
652
- # =============================================================================
653
- # Reach (@h-ai/reach)
654
- # =============================================================================
655
- # SMTP (uncomment when enabling email provider)
656
- # HAI_REACH_SMTP_HOST=smtp.example.com
657
- # HAI_REACH_SMTP_PORT=465
658
- # HAI_REACH_SMTP_USER=
659
- # HAI_REACH_SMTP_PASS=
660
- # HAI_REACH_SMTP_FROM=noreply@example.com
661
- # HAI_REACH_SMS_ACCESS_KEY=
662
- # HAI_REACH_SMS_SECRET_KEY=
663
- # HAI_REACH_API_TOKEN=
664
- # HAI_REACH_PROVIDERS= # JSON array replacing all providers, while retaining templates.
665
- `);
666
- }
667
- if (features.includes("payment") || includeDisabled) {
668
- sections.push(`
669
- # =============================================================================
670
- # Payment (@h-ai/payment)
671
- # =============================================================================
672
- # WeChat Pay
673
- # HAI_PAYMENT_WECHAT_MCHID=
674
- # HAI_PAYMENT_WECHAT_APIV3KEY=
675
- # HAI_PAYMENT_WECHAT_SERIALNO=
676
- # HAI_PAYMENT_WECHAT_PRIVATEKEY=
677
- # HAI_PAYMENT_WECHAT_PLATFORMCERT=
678
- # HAI_PAYMENT_WECHAT_APPID=
679
- # Alipay
680
- # HAI_PAYMENT_ALIPAY_APPID=
681
- # HAI_PAYMENT_ALIPAY_PRIVATEKEY=
682
- # HAI_PAYMENT_ALIPAY_ALIPAYPUBLICKEY=
683
- # Stripe
684
- # HAI_PAYMENT_STRIPE_SECRETKEY=
685
- # HAI_PAYMENT_STRIPE_WEBHOOKSECRET=
686
- `);
687
- }
688
- if (features.includes("deploy") || includeDisabled) {
689
- sections.push(`
690
- # =============================================================================
691
- # Deployment (@h-ai/deploy)
692
- # =============================================================================
693
- # HAI_DEPLOY_VERCEL_TOKEN=
694
- # HAI_DEPLOY_SSH_HOST=
695
- # HAI_DEPLOY_SSH_KEY=
696
- # HAI_DEPLOY_SSH_KNOWNHOSTSFILE=
697
- # HAI_DEPLOY_NEON_API_KEY=
698
- # HAI_DEPLOY_UPSTASH_EMAIL=
699
- # HAI_DEPLOY_UPSTASH_API_KEY=
700
- # HAI_DEPLOY_CF_ACCOUNT_ID=
701
- # HAI_DEPLOY_CF_API_TOKEN=
702
- # HAI_DEPLOY_R2_ACCESS_KEY_ID=
703
- # HAI_DEPLOY_R2_SECRET_ACCESS_KEY=
704
- # HAI_DEPLOY_RESEND_API_KEY=
705
- # HAI_DEPLOY_RESEND_FROM=
706
- # HAI_DEPLOY_ALIYUN_ACCESS_KEY_ID=
707
- # HAI_DEPLOY_ALIYUN_ACCESS_KEY_SECRET=
708
- # HAI_DEPLOY_ALIYUN_SIGN_NAME=
709
- `);
710
- }
711
- if (includeDisabled) {
712
- sections.push(`
713
- # =============================================================================
714
- # Service (@h-ai/serv)
715
- # =============================================================================
716
- # HOST=127.0.0.1 # HOST/PORT override _serv.yml server settings.
717
- # PORT=3000
718
- # HAI_CORS_ORIGIN=http://127.0.0.1:4173,http://localhost:4173
719
- # HAI_CORS_NATIVEORIGINS=http://localhost,https://localhost,http://tauri.localhost,https://tauri.localhost,tauri://localhost,capacitor://localhost
720
- # HAI_CORS_CREDENTIALS=true
721
- # HAI_SERV_HTTP_RPC_GATEWAYSECRET= # Enable the gateway-only RPC block before setting this.
722
- `);
723
- }
724
- sections.push(`
725
- # =============================================================================
726
- # Testing
727
- # =============================================================================
728
- # E2E test mode (relaxes rate limiting etc.)
729
- # HAI_E2E=1
730
- `);
731
- const content = sections.join("\n");
732
- return includeDisabled ? content.split("\n").map((line) => line && !line.startsWith("#") ? `# ${line}` : line).join("\n") : content;
733
- }
734
- function generateDeployConfig() {
735
- return `# =============================================================================
736
- # \u90E8\u7F72\u914D\u7F6E (@h-ai/deploy)
737
- # =============================================================================
738
- # \u90E8\u7F72\u5E73\u53F0\u51ED\u8BC1\u901A\u8FC7 ~/.hai/credentials.yml \u7BA1\u7406
739
- # \u73AF\u5883\u53D8\u91CF\u5F15\u7528\u683C\u5F0F: \${VAR_NAME:default_value}
740
-
741
- # \u90E8\u7F72\u5E73\u53F0
742
- provider:
743
- type: vercel
744
- token: \${HAI_DEPLOY_VERCEL_TOKEN}
745
-
746
- # ---------------------------------------------------------------------------
747
- # \u65B9\u5F0F\u4E8C\uFF1Adocker-ssh \u2014 \u5C06\u5E94\u7528\u5BB9\u5668\u5316\u540E\u901A\u8FC7 SSH \u90E8\u7F72\u5230\u4EFB\u610F Linux \u4E3B\u673A
748
- # \u8FDC\u7A0B\u4E3B\u673A\u53EA\u9700\u5177\u5907 SSH + docker/podman + compose\uFF0C\u672C\u5730\u9700 docker \u6216 podman
749
- # \u5207\u6362\u65F6\u7528\u4E0B\u65B9 provider \u66FF\u6362\u4E0A\u9762\u7684 vercel provider
750
- # ---------------------------------------------------------------------------
751
- # provider:
752
- # type: docker-ssh
753
- # ssh:
754
- # host: \${HAI_DEPLOY_SSH_HOST}
755
- # port: 22
756
- # username: deploy
757
- # identityFile: \${HAI_DEPLOY_SSH_KEY} # \u79C1\u94A5\u6587\u4EF6\u8DEF\u5F84\uFF08\u7701\u7565\u5219\u7528 ssh-agent\uFF09
758
- # knownHostsFile: \${HAI_DEPLOY_SSH_KNOWNHOSTSFILE}
759
- # strictHostKeyChecking: true
760
- # connectTimeoutSeconds: 10
761
- # remote:
762
- # baseDir: /opt/hai/apps
763
- # runtime: auto # auto \u4F18\u5148 podman\uFF0C\u5176\u6B21 docker
764
- # expose:
765
- # type: port
766
- # containerPort: 3000
767
- # hostPort: 18080 # \u8BBF\u95EE\u5730\u5740 http://<host>:18080
768
-
769
- # \u672C\u5730\u6784\u5EFA\u8FD0\u884C\u65F6\uFF08docker-ssh \u4F7F\u7528\uFF1Bauto \u4F18\u5148 podman\uFF09
770
- # container:
771
- # runtime: auto
772
-
773
- # \u57FA\u7840\u8BBE\u65BD\u670D\u52A1\uFF08\u6309\u9700\u5F00\u542F\uFF09
774
- # services:
775
- # PostgreSQL \u6570\u636E\u5E93 (Neon)
776
- # db:
777
- # provisioner: neon
778
- # apiKey: \${HAI_DEPLOY_NEON_API_KEY}
779
-
780
- # Redis \u7F13\u5B58 (Upstash)
781
- # cache:
782
- # provisioner: upstash
783
- # email: \${HAI_DEPLOY_UPSTASH_EMAIL}
784
- # apiKey: \${HAI_DEPLOY_UPSTASH_API_KEY}
785
-
786
- # S3 \u5B58\u50A8 (Cloudflare R2)
787
- # storage:
788
- # provisioner: cloudflare-r2
789
- # accountId: \${HAI_DEPLOY_CF_ACCOUNT_ID}
790
- # apiToken: \${HAI_DEPLOY_CF_API_TOKEN}
791
- # accessKeyId: \${HAI_DEPLOY_R2_ACCESS_KEY_ID}
792
- # secretAccessKey: \${HAI_DEPLOY_R2_SECRET_ACCESS_KEY}
793
-
794
- # \u90AE\u4EF6 (Resend)
795
- # email:
796
- # provisioner: resend
797
- # apiKey: \${HAI_DEPLOY_RESEND_API_KEY}
798
- # from: \${HAI_DEPLOY_RESEND_FROM}
799
-
800
- # \u77ED\u4FE1 (\u963F\u91CC\u4E91)
801
- # sms:
802
- # provisioner: aliyun
803
- # accessKeyId: \${HAI_DEPLOY_ALIYUN_ACCESS_KEY_ID}
804
- # accessKeySecret: \${HAI_DEPLOY_ALIYUN_ACCESS_KEY_SECRET}
805
- # signName: \${HAI_DEPLOY_ALIYUN_SIGN_NAME}
806
-
807
- # docker-ssh \u8BF4\u660E\uFF1A
808
- # - \u5E94\u7528\u955C\u50CF\u4F7F\u7528\u5DE5\u7A0B\u81EA\u5E26\u7684 Dockerfile\uFF08adapter-node\uFF09\uFF0C\u672C\u5730\u6784\u5EFA\u540E\u7ECF SSH \u4F20\u8F93\u5E76 load
809
- # - compose \u4F1A\u6309\u4E0A\u65B9\u542F\u7528\u7684 db/cache/storage \u81EA\u52A8\u8FFD\u52A0 postgres/redis/minio sidecar
810
- # - \u82E5\u540C\u65F6\u914D\u7F6E\u4E86\u5BF9\u5E94\u4E91 Provisioner\uFF0C\u5219\u4F18\u5148\u4F7F\u7528\u4E91\u8D44\u6E90\uFF0C\u4E0D\u518D\u81EA\u5EFA sidecar
811
- `;
812
- }
813
- function generateVecdbConfig() {
814
- return `# =============================================================================
815
- # \u5411\u91CF\u6570\u636E\u5E93\u914D\u7F6E (@h-ai/vecdb)
816
- # =============================================================================
817
-
818
- # \u6570\u636E\u5E93\u7C7B\u578B: lancedb | pgvector | qdrant | chroma
819
- type: lancedb
820
-
821
- # LanceDB \u6570\u636E\u76EE\u5F55
822
- path: ./data/vecdb
823
-
824
- # \u8DDD\u79BB\u5EA6\u91CF: cosine | euclidean | dot
825
- # metric: cosine
826
-
827
- # pgvector \u914D\u7F6E\uFF08\u5F53 type \u4E3A pgvector \u65F6\u4F7F\u7528\uFF09
828
- # type: pgvector
829
- # url: \${HAI_VECDB_URL}
830
- # host: localhost
831
- # port: 5432
832
- # database: hai
833
- # user: postgres
834
- # password: ''
835
- # indexType: hnsw
836
- # tablePrefix: vec_
837
-
838
- # Qdrant \u914D\u7F6E\uFF08\u5F53 type \u4E3A qdrant \u65F6\u4F7F\u7528\uFF09
839
- # type: qdrant
840
- # url: http://localhost:6333
841
- # apiKey: ''
842
-
843
- # Chroma \u914D\u7F6E\uFF08\u66FF\u6362 type\uFF1Burl \u6307\u5411\u5DF2\u6709\u670D\u52A1\uFF0Cpath \u7528\u4E8E\u672C\u5730\u5B50\u8FDB\u7A0B\u6570\u636E\u76EE\u5F55\uFF09
844
- # type: chroma
845
- # path: ./data/chroma
846
- # url: http://localhost:8000
847
- # host: localhost
848
- # port: 8000
849
- # apiKey: ''
850
- # serverCommand: chroma
851
- # startupTimeout: 30000
852
-
853
- # operationLog:
854
- # read: false
855
- # write: false
856
- # maxLength: 1000
857
- # level: debug # trace | debug | info
858
- `;
859
- }
860
- function generateReachConfig() {
861
- return `# =============================================================================
862
- # \u6D88\u606F\u63A8\u9001\u914D\u7F6E (@h-ai/reach)
863
- # =============================================================================
864
-
865
- providers:
866
- # \u63A7\u5236\u53F0\u8F93\u51FA\uFF08\u5F00\u53D1/\u6D4B\u8BD5\u7528\uFF09
867
- - name: console_dev
868
- type: console
869
-
870
- # SMTP \u90AE\u4EF6\uFF08\u6309\u9700\u5F00\u542F\uFF09
871
- # - name: email
872
- # type: smtp
873
- # host: \${HAI_REACH_SMTP_HOST:smtp.example.com}
874
- # port: \${HAI_REACH_SMTP_PORT:465}
875
- # secure: true
876
- # user: \${HAI_REACH_SMTP_USER:}
877
- # pass: \${HAI_REACH_SMTP_PASS:}
878
- # from: \${HAI_REACH_SMTP_FROM:noreply@example.com}
879
-
880
- # \u963F\u91CC\u4E91\u77ED\u4FE1\uFF08\u6309\u9700\u5F00\u542F\uFF09
881
- # - name: sms
882
- # type: aliyun-sms
883
- # accessKeyId: \${HAI_REACH_SMS_ACCESS_KEY}
884
- # accessKeySecret: \${HAI_REACH_SMS_SECRET_KEY}
885
- # signName: MyApp
886
- # endpoint: dysmsapi.aliyuncs.com
887
-
888
- # \u901A\u7528 API\uFF08\u6309\u9700\u5F00\u542F\uFF1B\u53EF\u5BF9\u63A5\u5E94\u7528\u81EA\u6709\u6295\u9012\u670D\u52A1\uFF09
889
- # - name: custom
890
- # type: api
891
- # url: https://notify.example.com/send
892
- # method: POST # POST | PUT
893
- # headers:
894
- # Authorization: 'Bearer \${HAI_REACH_API_TOKEN}'
895
- # timeout: 10000
896
-
897
- # IAM \u6807\u51C6\u6A21\u677F\uFF1A\u4FDD\u7559\u7A7A\u6570\u7EC4\u4EE5\u652F\u6301 HAI_REACH_TEMPLATES \u6574\u4F53\u8986\u76D6\u3002
898
- templates: []
899
- # \u5F00\u542F\u5BF9\u5E94 Provider \u540E\uFF0C\u5C06\u7A7A\u6570\u7EC4\u66FF\u6362\u4E3A\u9700\u8981\u7684\u6A21\u677F\u5217\u8868\uFF0C\u4F8B\u5982\uFF1A
900
- # templates:
901
- # - name: otp_email
902
- # provider: email
903
- # subject: "Verification code"
904
- # body: "Your verification code is {code}."
905
- # - name: otp_sms
906
- # provider: sms
907
- # body: "Your verification code is {code}."
908
- # - name: password_reset
909
- # provider: email
910
- # subject: "Password reset"
911
- # body: "Reset your password: {resetUrl}. Expires at {expiresAt}."
912
- # - name: password_reset_sms
913
- # provider: sms
914
- # body: "Reset your password: {resetUrl}. Expires at {expiresAt}."
915
-
916
- # \u514D\u6253\u6270\uFF08\u53EF\u9009\uFF09
917
- # dnd:
918
- # enabled: true
919
- # strategy: delay
920
- # start: "22:00"
921
- # end: "08:00"
922
- `;
923
- }
924
- function generateSchedulerConfig() {
925
- return `# =============================================================================
926
- # \u4EFB\u52A1\u8C03\u5EA6\u914D\u7F6E (@h-ai/scheduler)
927
- # =============================================================================
928
-
929
- # \u662F\u5426\u542F\u7528\u6570\u636E\u5E93\u65E5\u5FD7\uFF08\u9700\u8981 @h-ai/reldb\uFF09
930
- enableDb: true
931
-
932
- # \u68C0\u67E5\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09
933
- tickInterval: 1000
934
-
935
- # \u9501\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
936
- lockExpireMs: 300000
937
-
938
- # \u8282\u70B9 ID \u9ED8\u8BA4\u81EA\u52A8\u751F\u6210\uFF1B\u591A\u8282\u70B9\u90E8\u7F72\u65F6\u6BCF\u4E2A\u5B9E\u4F8B\u5E94\u4F7F\u7528\u72EC\u7ACB ID\u3002
939
- # nodeId: worker-1
940
- # \u6267\u884C\u65E5\u5FD7\u4FDD\u7559\u7B56\u7565\uFF08\u542F\u7528\u6570\u636E\u5E93\u65F6\u4F7F\u7528\uFF09
941
- # maxLogs: 10000
942
- # retentionDays: 30
943
- `;
944
- }
945
- function generateAuditConfig() {
946
- return `# =============================================================================
947
- # \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E (@h-ai/audit)
948
- # =============================================================================
949
-
950
- # \u7528\u6237\u8868\u540D\uFF08\u7528\u4E8E JOIN \u67E5\u8BE2\uFF09
951
- userTable: hai_iam_users
952
-
953
- # \u7528\u6237\u8868\u4E3B\u952E\u5217\u540D
954
- userIdColumn: id
955
-
956
- # \u7528\u6237\u540D\u5217\u540D
957
- userNameColumn: username
958
- `;
959
- }
960
- function generatePaymentConfig() {
961
- return `# =============================================================================
962
- # \u652F\u4ED8\u914D\u7F6E (@h-ai/payment)
963
- # =============================================================================
964
-
965
- # \u5FAE\u4FE1\u652F\u4ED8\uFF08\u6309\u9700\u5F00\u542F\uFF09
966
- # wechat:
967
- # mchId: ''
968
- # apiV3Key: ''
969
- # serialNo: ''
970
- # privateKey: ''
971
- # platformCert: ''
972
- # appId: ''
973
-
974
- # \u652F\u4ED8\u5B9D\uFF08\u6309\u9700\u5F00\u542F\uFF09
975
- # alipay:
976
- # appId: ''
977
- # privateKey: ''
978
- # alipayPublicKey: ''
979
- # signType: RSA2
980
- # sandbox: false
981
-
982
- # Stripe\uFF08\u6309\u9700\u5F00\u542F\uFF09
983
- # stripe:
984
- # secretKey: ''
985
- # webhookSecret: ''
986
- # webhookToleranceSeconds: 300
987
- `;
988
- }
989
-
990
- export { generateConfigFile, generateEnvExample };
991
- //# sourceMappingURL=chunk-WW2MIO6T.js.map
992
- //# sourceMappingURL=chunk-WW2MIO6T.js.map