@h-ai/cli 0.1.0-alpha.57 → 0.1.0-alpha.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +37 -3
- package/README.ja.md +37 -3
- package/README.md +37 -3
- package/dist/chunk-2H7UOFLK.js +0 -0
- package/dist/{chunk-MJGUBOAV.js → chunk-F4IBPVZ5.js} +6 -42
- package/dist/chunk-F4IBPVZ5.js.map +1 -0
- package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
- package/dist/chunk-WUSFJFW5.js.map +1 -0
- package/dist/cli-config-templates-6XA7V6CC.js +5 -0
- package/dist/{cli-config-templates-OWBEGBZQ.js.map → cli-config-templates-6XA7V6CC.js.map} +1 -1
- package/dist/{cli-skill-templates-ZYXES3NT.js → cli-skill-templates-45CK4RQ2.js} +3 -3
- package/dist/{cli-skill-templates-ZYXES3NT.js.map → cli-skill-templates-45CK4RQ2.js.map} +1 -1
- package/dist/index.js +107 -61
- package/dist/index.js.map +1 -1
- package/dist/{src-TBIET7YU.js → src-DUGLX4YB.js} +7270 -2119
- package/dist/src-DUGLX4YB.js.map +1 -0
- package/package.json +17 -17
- package/templates/README.md +4 -4
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +7 -0
- package/templates/apps/admin/src/routes/+page.svelte.hbs +5 -4
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +2 -2
- package/templates/apps/api/.npmrc.hbs +1 -2
- package/templates/apps/api/Dockerfile.hbs +6 -5
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
- package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
- package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
- package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
- package/templates/apps/api/e2e/api-service.spec.ts.hbs +3 -1
- package/templates/apps/api/package.json.hbs +2 -2
- package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
- package/templates/apps/api/tsconfig.base.json +0 -1
- package/templates/apps/fullstack/.dockerignore.hbs +3 -0
- package/templates/apps/fullstack/.npmrc.hbs +1 -2
- package/templates/apps/fullstack/Dockerfile.hbs +6 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +206 -16
- package/templates/apps/fullstack/package.json.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
- package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
- package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
- package/templates/apps/fullstack/tsconfig.base.json +0 -1
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
- package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
- package/templates/apps/mobile-app/index.html.hbs +2 -2
- package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
- package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
- package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
- package/templates/base/.npmrc.hbs +1 -15
- package/templates/base/Dockerfile.hbs +9 -8
- package/templates/base/e2e/app.spec.ts.hbs +1 -0
- package/templates/base/package.json.hbs +39 -42
- package/templates/base/pnpm-workspace.yaml.hbs +26 -0
- package/templates/base/src/app.d.ts.hbs +4 -0
- package/templates/base/src/hooks.server.ts.hbs +0 -8
- package/templates/base/src/lib/server/init.ts.hbs +26 -5
- package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
- package/templates/base/tests/scaffold.test.ts.hbs +21 -1
- package/templates/base/vite.config.ts.hbs +21 -0
- package/templates/features/ai/routes/api/chat/+server.ts +6 -7
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
- package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
- package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
- package/templates/features/storage/routes/api/upload/+server.ts +10 -8
- package/templates/skills/CLAUDE.md +0 -14
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +13 -2
- package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +3 -0
- package/templates/skills/hai-api-client/SKILL.md +1 -1
- package/templates/skills/hai-app-create/development.md +6 -0
- package/templates/skills/hai-build/reference.md +4 -2
- package/templates/skills/hai-core/SKILL.md +2 -0
- package/templates/skills/hai-core/reference.md +6 -4
- package/templates/skills/hai-framework-sync/SKILL.md +1 -2
- package/templates/skills/hai-serv/SKILL.md +1 -0
- package/templates/skills/hai-serv/reference.md +3 -1
- package/templates/skills/hai-ui/SKILL.md +6 -0
- package/templates/skills/hai-ui/reference.md +7 -4
- package/templates/skills/hai-vecdb/reference.md +53 -49
- package/dist/chunk-MJGUBOAV.js.map +0 -1
- package/dist/chunk-O3ANVICQ.js.map +0 -1
- package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
- package/dist/src-TBIET7YU.js.map +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
- package/templates/skills/bridges/admin/CLAUDE.md +0 -15
- package/templates/skills/bridges/api/CLAUDE.md +0 -15
- package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -9
- package/templates/skills/bridges/h5/CLAUDE.md +0 -15
- package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -15
- package/templates/skills/bridges/website/CLAUDE.md +0 -15
- package/templates/skills/claude-skill.md.hbs +0 -7
package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import * as m from '../src/lib/paraglide/messages.js'
|
|
3
|
+
import { ManagementStore } from '../src/lib/stores/management-store.svelte.js'
|
|
4
|
+
|
|
5
|
+
const api = vi.hoisted(() => ({
|
|
6
|
+
auth: { clear: vi.fn(), setTokens: vi.fn() },
|
|
7
|
+
iam: { auth: { login: vi.fn(), logout: vi.fn(), currentUser: vi.fn() } },
|
|
8
|
+
admin: { users: { list: vi.fn() } },
|
|
9
|
+
}))
|
|
10
|
+
vi.mock('../src/lib/api/api-client.js', () => ({
|
|
11
|
+
managementApi: api,
|
|
12
|
+
initializeManagementApi: vi.fn(),
|
|
13
|
+
resolveAvatarUrl: (url: string | undefined) => url,
|
|
14
|
+
}))
|
|
15
|
+
|
|
16
|
+
const member = {
|
|
17
|
+
id: 'member-id',
|
|
18
|
+
username: 'member',
|
|
19
|
+
enabled: true,
|
|
20
|
+
roles: ['user'],
|
|
21
|
+
permissions: [],
|
|
22
|
+
createdAt: '2026-01-01T00:00:00.000Z',
|
|
23
|
+
updatedAt: '2026-01-01T00:00:00.000Z',
|
|
24
|
+
}
|
|
25
|
+
const administrator = { ...member, id: 'admin-id', username: 'admin', roles: ['admin'] }
|
|
26
|
+
const forbidden = { success: false, error: { code: 'test:forbidden', message: 'Forbidden', httpStatus: 403 } } as const
|
|
27
|
+
|
|
28
|
+
function deferred<T>() {
|
|
29
|
+
let resolve!: (result: T) => void
|
|
30
|
+
const promise = new Promise<T>((done) => {
|
|
31
|
+
resolve = done
|
|
32
|
+
})
|
|
33
|
+
return { promise, resolve }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
vi.resetAllMocks()
|
|
38
|
+
api.iam.auth.login.mockResolvedValue({ success: true, data: { tokens: { accessToken: 'test-access', expiresIn: 3600, tokenType: 'Bearer' } } })
|
|
39
|
+
api.iam.auth.logout.mockResolvedValue({ success: true })
|
|
40
|
+
api.iam.auth.currentUser.mockResolvedValue({ success: true, data: member })
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
describe('management session and request ownership', () => {
|
|
44
|
+
it('ignores a previous administrator failure after logout and another user login', async () => {
|
|
45
|
+
const oldRequest = deferred<typeof forbidden>()
|
|
46
|
+
api.admin.users.list.mockReturnValueOnce(oldRequest.promise)
|
|
47
|
+
const store = new ManagementStore()
|
|
48
|
+
store.user = administrator
|
|
49
|
+
const loading = store.loadUsers()
|
|
50
|
+
await store.logout()
|
|
51
|
+
await store.login({ username: 'member', password: 'test-password', rememberMe: false })
|
|
52
|
+
oldRequest.resolve(forbidden)
|
|
53
|
+
await loading
|
|
54
|
+
expect(store.user?.id).toBe(member.id)
|
|
55
|
+
expect(store.page).toBe('settings')
|
|
56
|
+
expect(store.error).toBe('')
|
|
57
|
+
expect(store.loading).toBe(false)
|
|
58
|
+
expect(api.iam.auth.currentUser).toHaveBeenCalledTimes(1)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('ignores an obsolete page failure after opening personal settings', async () => {
|
|
62
|
+
const oldRequest = deferred<typeof forbidden>()
|
|
63
|
+
api.admin.users.list.mockReturnValueOnce(oldRequest.promise)
|
|
64
|
+
const store = new ManagementStore()
|
|
65
|
+
store.user = administrator
|
|
66
|
+
const loading = store.loadUsers()
|
|
67
|
+
await store.navigate('settings')
|
|
68
|
+
oldRequest.resolve(forbidden)
|
|
69
|
+
await loading
|
|
70
|
+
expect(store.user?.id).toBe(administrator.id)
|
|
71
|
+
expect(store.page).toBe('settings')
|
|
72
|
+
expect(store.error).toBe('')
|
|
73
|
+
expect(store.loading).toBe(false)
|
|
74
|
+
expect(api.iam.auth.currentUser).not.toHaveBeenCalled()
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('refreshes revoked roles once and clears administration data', async () => {
|
|
78
|
+
api.admin.users.list.mockResolvedValueOnce(forbidden)
|
|
79
|
+
const store = new ManagementStore()
|
|
80
|
+
store.user = administrator
|
|
81
|
+
store.roles = [{ id: 'role-id', code: 'admin', name: 'Administrator', userCount: 1 }]
|
|
82
|
+
await store.loadUsers()
|
|
83
|
+
expect(store.user?.roles).toEqual(['user'])
|
|
84
|
+
expect(store.page).toBe('settings')
|
|
85
|
+
expect(store.roles).toEqual([])
|
|
86
|
+
expect(store.users).toEqual([])
|
|
87
|
+
expect(store.loading).toBe(false)
|
|
88
|
+
expect(store.error).toBe(m.forbidden())
|
|
89
|
+
expect(api.iam.auth.currentUser).toHaveBeenCalledTimes(1)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('reports a connection failure separately from invalid credentials', async () => {
|
|
93
|
+
api.iam.auth.login.mockResolvedValueOnce({ success: false, error: { code: 'test:unavailable', message: 'Unavailable', httpStatus: 502 } })
|
|
94
|
+
const store = new ManagementStore()
|
|
95
|
+
await store.login({ username: 'member', password: 'test-password', rememberMe: false })
|
|
96
|
+
expect(store.error).toBe(m.network_error())
|
|
97
|
+
expect(store.error).not.toBe(m.login_invalid())
|
|
98
|
+
expect(store.saving).toBe(false)
|
|
99
|
+
expect(api.iam.auth.currentUser).not.toHaveBeenCalled()
|
|
100
|
+
})
|
|
101
|
+
})
|
|
@@ -55,6 +55,12 @@ export default defineConfig({
|
|
|
55
55
|
env: {
|
|
56
56
|
HOST: serviceHost,
|
|
57
57
|
PORT: servicePort,
|
|
58
|
+
// 仅供脚手架验收:生产启动必须由部署环境提供初始管理员密码。
|
|
59
|
+
HAI_ADMIN_DEFAULT_PASSWORD: process.env.E2E_ADMIN_PASSWORD || 'Scaffold-test-Admin123!',
|
|
60
|
+
HAI_CORE_NAME: process.env.HAI_CORE_NAME || 'Configured scaffold',
|
|
61
|
+
HAI_CORE_VERSION: process.env.HAI_CORE_VERSION || '9.8.7',
|
|
62
|
+
HAI_CORE_ENV: process.env.HAI_CORE_ENV || 'test',
|
|
63
|
+
HAI_CORE_LOGGING_LEVEL: 'warn',
|
|
58
64
|
},
|
|
59
65
|
url: `${serviceBaseURL}/health`,
|
|
60
66
|
reuseExistingServer: false,
|
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
shellEmulator: true
|
|
3
3
|
|
|
4
4
|
trustPolicy: no-downgrade
|
|
5
|
+
# 上游构建工具仍要求 4.x;4.0.3 tarball 已核对原 lockfile 的 SHA-512。
|
|
6
|
+
trustPolicyExclude:
|
|
7
|
+
- chokidar@4.0.3
|
|
8
|
+
|
|
9
|
+
# pnpm 12 配置;原生依赖仅运行明确列出的安装脚本。
|
|
10
|
+
nodeLinker: hoisted
|
|
11
|
+
allowBuilds:
|
|
12
|
+
onnxruntime-node: true
|
|
13
|
+
protobufjs: true
|
|
14
|
+
vue-demi: true
|
|
15
|
+
better-sqlite3: true
|
|
16
|
+
esbuild: true
|
|
17
|
+
core-js: false
|
|
18
|
+
|
|
19
|
+
overrides:
|
|
20
|
+
"@ai-sdk/provider-utils@>=4.0.0 <4.0.33": 4.0.57
|
|
21
|
+
cookie@<0.7.0: 0.7.2
|
|
22
|
+
esbuild@<0.28.1: 0.28.2
|
|
23
|
+
katex@<0.18.2: 0.18.10
|
|
24
|
+
sharp@<0.35.5: 0.35.5
|
|
25
|
+
tinypool@<2.1.2: 2.2.0
|
|
26
|
+
'@qdrant/js-client-rest>undici': 7.30.0
|
|
27
|
+
xcode>uuid: 11.1.1
|
|
28
|
+
"@types/node": "{{versions.nodeTypes}}"
|
|
5
29
|
|
|
6
30
|
packages:
|
|
7
31
|
- packages/*
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{{!-- H5 首页 --}}
|
|
2
2
|
<script lang='ts'>
|
|
3
|
+
import { page } from '$app/state'
|
|
3
4
|
/**
|
|
4
5
|
* H5 首页
|
|
5
6
|
*/
|
|
@@ -11,9 +12,9 @@
|
|
|
11
12
|
|
|
12
13
|
<svelte:head>
|
|
13
14
|
{{#if hasI18n}}
|
|
14
|
-
<title>{
|
|
15
|
+
<title>{page.data.appConfig.name}</title>
|
|
15
16
|
{{else}}
|
|
16
|
-
<title>
|
|
17
|
+
<title>{page.data.appConfig.name}</title>
|
|
17
18
|
{{/if}}
|
|
18
19
|
</svelte:head>
|
|
19
20
|
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
6
6
|
<meta name="theme-color" content="#2563eb" />
|
|
7
|
-
<title
|
|
7
|
+
<title></title>
|
|
8
8
|
</head>
|
|
9
9
|
<body>
|
|
10
10
|
<div id="app"></div>
|
|
11
11
|
<script type="module" src="/src/main.ts"></script>
|
|
12
12
|
</body>
|
|
13
|
-
</html>
|
|
13
|
+
</html>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { applyTheme, getSavedTheme, setGlobalLocale } from '@h-ai/ui'
|
|
3
3
|
import { onMount } from 'svelte'
|
|
4
4
|
import { closeApi, initApi, resolveApiBase, usesNativeTokenStorage } from './lib/api.js'
|
|
5
|
+
import { appConfig, initClientCore } from './lib/app-config.js'
|
|
5
6
|
import { initCapacitor, isNativeApp } from './lib/capacitor.js'
|
|
6
7
|
import * as m from './lib/paraglide/messages.js'
|
|
7
8
|
import { getLocale } from './lib/paraglide/runtime.js'
|
|
@@ -22,6 +23,8 @@
|
|
|
22
23
|
|
|
23
24
|
async function bootstrap(): Promise<void> {
|
|
24
25
|
try {
|
|
26
|
+
initClientCore()
|
|
27
|
+
document.title = appConfig.name
|
|
25
28
|
applyTheme(getSavedTheme(), false)
|
|
26
29
|
setGlobalLocale(getLocale())
|
|
27
30
|
await initCapacitor()
|
|
@@ -73,7 +76,7 @@
|
|
|
73
76
|
{:else}
|
|
74
77
|
<div class='hai-mobile-viewport'>
|
|
75
78
|
<div class='hai-mobile-shell max-w-lg'>
|
|
76
|
-
<AppBar title={
|
|
79
|
+
<AppBar title={appConfig.name} safeArea fixed={false} class='bg-base-100/95 backdrop-blur border-base-content/8' />
|
|
77
80
|
|
|
78
81
|
<main class='hai-mobile-main'>
|
|
79
82
|
{#if activeTab === 'home'}
|
|
@@ -102,6 +105,7 @@
|
|
|
102
105
|
</div>
|
|
103
106
|
|
|
104
107
|
<Card title={m.status_title()} shadow='sm'>
|
|
108
|
+
<p class='mb-3 text-xs text-base-content/50'>{appConfig.name} · {appConfig.version} · {appConfig.env}</p>
|
|
105
109
|
<div class='grid grid-cols-2 gap-3 text-sm'>
|
|
106
110
|
<div>
|
|
107
111
|
<p class='text-base-content/50'>{m.status_api_label()}</p>
|
|
@@ -159,4 +163,4 @@
|
|
|
159
163
|
</div>
|
|
160
164
|
{/if}
|
|
161
165
|
|
|
162
|
-
<ToastContainer />
|
|
166
|
+
<ToastContainer />
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
2
|
+
import { core } from '@h-ai/core'
|
|
3
|
+
|
|
4
|
+
declare const __APP_CORE_CONFIG__: Pick<CoreConfig, 'name' | 'version' | 'env' | 'defaultLocale'> & {
|
|
5
|
+
logging?: Pick<NonNullable<CoreConfig['logging']>, 'level' | 'format'>
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Vite 经 core 加载后注入的公开配置,修改 YAML 后重新构建客户端。 */
|
|
9
|
+
export const appConfig = __APP_CORE_CONFIG__
|
|
10
|
+
|
|
11
|
+
export function initClientCore(): void {
|
|
12
|
+
core.init({ logging: appConfig.logging })
|
|
13
|
+
}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { browser } from '$app/environment'
|
|
9
9
|
{{/if}}
|
|
10
10
|
import { resolve } from '$app/paths'
|
|
11
|
+
import { page } from '$app/state'
|
|
11
12
|
{{#if hasI18n}}
|
|
12
13
|
import * as m from '$lib/paraglide/messages'
|
|
13
14
|
import { getLocale } from '$lib/paraglide/runtime.js'
|
|
@@ -43,13 +44,17 @@
|
|
|
43
44
|
{{/if}}
|
|
44
45
|
</script>
|
|
45
46
|
|
|
47
|
+
<svelte:head>
|
|
48
|
+
<title>{page.data.appConfig.name}</title>
|
|
49
|
+
</svelte:head>
|
|
50
|
+
|
|
46
51
|
<div class='min-h-screen flex flex-col'>
|
|
47
52
|
<header class='navbar bg-base-100 shadow-sm'>
|
|
48
53
|
<div class='flex-1'>
|
|
49
54
|
{{#if hasI18n}}
|
|
50
|
-
<a href={resolve('/', {})} class='btn btn-ghost text-xl font-black tracking-tight'>{
|
|
55
|
+
<a href={resolve('/', {})} class='btn btn-ghost text-xl font-black tracking-tight'>{page.data.appConfig.name}</a>
|
|
51
56
|
{{else}}
|
|
52
|
-
<a href={resolve('/', {})} class='btn btn-ghost text-xl font-black tracking-tight'
|
|
57
|
+
<a href={resolve('/', {})} class='btn btn-ghost text-xl font-black tracking-tight'>{page.data.appConfig.name}</a>
|
|
53
58
|
{{/if}}
|
|
54
59
|
</div>
|
|
55
60
|
<nav class='flex-none'>
|
|
@@ -66,6 +71,7 @@
|
|
|
66
71
|
</main>
|
|
67
72
|
|
|
68
73
|
<footer class='footer footer-center p-4 bg-base-300 text-base-content'>
|
|
74
|
+
<span>{page.data.appConfig.name} · {page.data.appConfig.version} · {page.data.appConfig.env}</span>
|
|
69
75
|
{{#if hasI18n}}
|
|
70
76
|
<p>{m.footer_copyright({ year: new Date().getFullYear() })}</p>
|
|
71
77
|
{{else}}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* 官网首页
|
|
5
5
|
*/
|
|
6
6
|
import { resolve } from '$app/paths'
|
|
7
|
+
import { page } from '$app/state'
|
|
7
8
|
{{#if hasI18n}}
|
|
8
9
|
import * as m from '$lib/paraglide/messages'
|
|
9
10
|
{{/if}}
|
|
@@ -12,9 +13,9 @@
|
|
|
12
13
|
|
|
13
14
|
<svelte:head>
|
|
14
15
|
{{#if hasI18n}}
|
|
15
|
-
<title>{
|
|
16
|
+
<title>{page.data.appConfig.name}</title>
|
|
16
17
|
{{else}}
|
|
17
|
-
<title
|
|
18
|
+
<title>{page.data.appConfig.name}</title>
|
|
18
19
|
{{/if}}
|
|
19
20
|
</svelte:head>
|
|
20
21
|
|
|
@@ -25,7 +26,7 @@
|
|
|
25
26
|
<Badge variant='primary'>
|
|
26
27
|
<span class='icon-[tabler--sparkles] size-4'></span>
|
|
27
28
|
{{#if hasI18n}}
|
|
28
|
-
{
|
|
29
|
+
{page.data.appConfig.name}
|
|
29
30
|
{{else}}
|
|
30
31
|
由 hai 驱动
|
|
31
32
|
{{/if}}
|
|
@@ -1,15 +1 @@
|
|
|
1
|
-
#
|
|
2
|
-
# pnpm configuration
|
|
3
|
-
# =============================================================================
|
|
4
|
-
|
|
5
|
-
# Hoist all packages to node_modules root (required for native addons like better-sqlite3)
|
|
6
|
-
shamefully-hoist=true
|
|
7
|
-
|
|
8
|
-
# Use hoisted node_modules layout instead of pnpm's default symlink isolation
|
|
9
|
-
node-linker=hoisted
|
|
10
|
-
|
|
11
|
-
# Do not fail on peer dependency conflicts
|
|
12
|
-
strict-peer-dependencies=false
|
|
13
|
-
|
|
14
|
-
# Automatically install missing peer dependencies
|
|
15
|
-
auto-install-peers=true
|
|
1
|
+
# 注册表与认证可配置在此;pnpm 专属设置统一位于 pnpm-workspace.yaml。
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# syntax=docker/dockerfile:1.7
|
|
2
2
|
{{#if isSvelteOnlyApp}}
|
|
3
|
-
FROM node:
|
|
3
|
+
FROM node:24-bookworm-slim AS build
|
|
4
4
|
|
|
5
5
|
ENV PNPM_HOME=/pnpm
|
|
6
6
|
ENV PATH=$PNPM_HOME:$PATH
|
|
7
7
|
ENV CI=true
|
|
8
8
|
WORKDIR /workspace
|
|
9
9
|
|
|
10
|
-
RUN corepack enable && corepack prepare pnpm@
|
|
10
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate
|
|
11
11
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
12
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
12
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
13
13
|
COPY . .
|
|
14
14
|
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
15
15
|
RUN pnpm build
|
|
@@ -23,24 +23,25 @@ EXPOSE 8080
|
|
|
23
23
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
24
24
|
CMD wget -q -O /dev/null http://127.0.0.1:8080/health || exit 1
|
|
25
25
|
{{else}}
|
|
26
|
-
FROM node:
|
|
26
|
+
FROM node:24-bookworm-slim AS build
|
|
27
27
|
|
|
28
28
|
ENV PNPM_HOME=/pnpm
|
|
29
29
|
ENV PATH=$PNPM_HOME:$PATH
|
|
30
30
|
ENV CI=true
|
|
31
31
|
WORKDIR /workspace
|
|
32
32
|
|
|
33
|
-
RUN corepack enable && corepack prepare pnpm@
|
|
33
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate
|
|
34
34
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
35
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
35
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
36
36
|
COPY . .
|
|
37
37
|
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
38
38
|
RUN pnpm build
|
|
39
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm --filter {{projectName}} --prod
|
|
39
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm pm deploy --filter {{projectName}} --prod /prod/app
|
|
40
40
|
|
|
41
|
-
FROM node:
|
|
41
|
+
FROM node:24-bookworm-slim AS runtime-base
|
|
42
42
|
|
|
43
43
|
ENV NODE_ENV=production
|
|
44
|
+
ENV HAI_CORE_ENV=production
|
|
44
45
|
ENV HOST=0.0.0.0
|
|
45
46
|
ENV PORT=3000
|
|
46
47
|
WORKDIR /app
|
|
@@ -5,6 +5,7 @@ test('home page renders from browser', async ({ page }) => {
|
|
|
5
5
|
const pageErrors: string[] = []
|
|
6
6
|
page.on('pageerror', error => pageErrors.push(error.message))
|
|
7
7
|
await page.goto('/')
|
|
8
|
+
await expect(page).toHaveTitle(process.env.HAI_CORE_NAME ?? '{{projectName}}')
|
|
8
9
|
await expect(pageErrors).toEqual([])
|
|
9
10
|
await expect(page.locator('main, section').first()).toBeVisible()
|
|
10
11
|
})
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"engines": { "node": "
|
|
2
|
+
"engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
|
|
3
3
|
"name": "{{projectName}}",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.58",
|
|
5
5
|
"private": true,
|
|
6
|
-
"packageManager": "pnpm@
|
|
6
|
+
"packageManager": "pnpm@12.11.2",
|
|
7
7
|
"description": "{{#if_eq appType 'admin'}}Enterprise management system built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'website'}}Enterprise website built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'h5'}}Mobile H5 app built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'api'}}REST API service built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'mobile-app'}}Mobile app built with hai Agent Framework{{/if_eq}}",
|
|
8
8
|
"keywords": ["hai", {{#unless isSvelteOnlyApp}}"sveltekit", {{/unless}}"svelte5", "{{appType}}"],
|
|
9
9
|
"license": "Apache-2.0",
|
|
@@ -75,51 +75,48 @@
|
|
|
75
75
|
"@h-ai/capacitor": "{{haiPackageSpecifier}}"{{/if}}{{#if isCapacitorApp}}{{#unless features.api-client}},
|
|
76
76
|
"@h-ai/api-client": "{{haiPackageSpecifier}}"{{/unless}}{{#unless features.capacitor}},
|
|
77
77
|
"@h-ai/capacitor": "{{haiPackageSpecifier}}"{{/unless}}{{/if}},
|
|
78
|
-
"zod": "
|
|
78
|
+
"zod": "{{versions.zod}}"
|
|
79
79
|
{{/if}}
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
|
-
"@antfu/eslint-config": "
|
|
83
|
-
"@playwright/test": "
|
|
82
|
+
"@antfu/eslint-config": "{{versions.antfuEslintConfig}}",
|
|
83
|
+
"@playwright/test": "{{versions.playwright}}",
|
|
84
84
|
{{#if isCapacitorApp}}
|
|
85
|
-
"@aparajita/capacitor-secure-storage": "
|
|
86
|
-
"@capacitor/app": "
|
|
87
|
-
"@capacitor/camera": "
|
|
88
|
-
"@capacitor/cli": "
|
|
89
|
-
"@capacitor/core": "
|
|
90
|
-
"@capacitor/android": "
|
|
91
|
-
"@capacitor/device": "
|
|
92
|
-
"@capacitor/ios": "
|
|
93
|
-
"@capacitor/preferences": "
|
|
94
|
-
"@capacitor/push-notifications": "
|
|
95
|
-
"@capacitor/status-bar": "
|
|
85
|
+
"@aparajita/capacitor-secure-storage": "{{versions.capacitorSecureStorage}}",
|
|
86
|
+
"@capacitor/app": "{{versions.capacitorApp}}",
|
|
87
|
+
"@capacitor/camera": "{{versions.capacitorCamera}}",
|
|
88
|
+
"@capacitor/cli": "{{versions.capacitorCli}}",
|
|
89
|
+
"@capacitor/core": "{{versions.capacitorCore}}",
|
|
90
|
+
"@capacitor/android": "{{versions.capacitorAndroid}}",
|
|
91
|
+
"@capacitor/device": "{{versions.capacitorDevice}}",
|
|
92
|
+
"@capacitor/ios": "{{versions.capacitorIos}}",
|
|
93
|
+
"@capacitor/preferences": "{{versions.capacitorPreferences}}",
|
|
94
|
+
"@capacitor/push-notifications": "{{versions.capacitorPushNotifications}}",
|
|
95
|
+
"@capacitor/status-bar": "{{versions.capacitorStatusBar}}",
|
|
96
96
|
{{else}}
|
|
97
|
-
"@sveltejs/adapter-node": "
|
|
97
|
+
"@sveltejs/adapter-node": "{{versions.svelteAdapterNode}}",
|
|
98
98
|
{{/if}}
|
|
99
99
|
{{#unless isSvelteOnlyApp}}
|
|
100
|
-
"@sveltejs/kit": "
|
|
100
|
+
"@sveltejs/kit": "{{versions.svelteKit}}",
|
|
101
101
|
{{/unless}}
|
|
102
|
-
"@sveltejs/vite-plugin-svelte": "
|
|
103
|
-
"@types/node": "
|
|
104
|
-
"eslint": "
|
|
105
|
-
"eslint-plugin-format": "
|
|
106
|
-
"eslint-plugin-svelte": "
|
|
107
|
-
"rimraf": "
|
|
108
|
-
"svelte": "
|
|
109
|
-
"svelte-check": "
|
|
110
|
-
"svelte-eslint-parser": "
|
|
111
|
-
"typescript": "
|
|
112
|
-
"vite": "
|
|
113
|
-
"vitest": "
|
|
114
|
-
"@tailwindcss/vite": "
|
|
115
|
-
"tailwindcss": "
|
|
116
|
-
"daisyui": "
|
|
117
|
-
"@iconify-json/tabler": "
|
|
118
|
-
"@iconify/tailwind4": "
|
|
119
|
-
"@inlang/paraglide-js": "
|
|
120
|
-
"@inlang/plugin-message-format": "
|
|
121
|
-
}
|
|
122
|
-
"pnpm": {
|
|
123
|
-
"onlyBuiltDependencies": ["better-sqlite3"]
|
|
124
|
-
}{{/if}}
|
|
102
|
+
"@sveltejs/vite-plugin-svelte": "{{versions.sveltePlugin}}",
|
|
103
|
+
"@types/node": "{{versions.nodeTypes}}",
|
|
104
|
+
"eslint": "{{versions.eslint}}",
|
|
105
|
+
"eslint-plugin-format": "{{versions.eslintPluginFormat}}",
|
|
106
|
+
"eslint-plugin-svelte": "{{versions.eslintPluginSvelte}}",
|
|
107
|
+
"rimraf": "{{versions.rimraf}}",
|
|
108
|
+
"svelte": "{{versions.svelte}}",
|
|
109
|
+
"svelte-check": "{{versions.svelteCheck}}",
|
|
110
|
+
"svelte-eslint-parser": "{{versions.svelteEslintParser}}",
|
|
111
|
+
"typescript": "{{versions.typescript}}",
|
|
112
|
+
"vite": "{{versions.vite}}",
|
|
113
|
+
"vitest": "{{versions.vitest}}"{{#if hasUi}},
|
|
114
|
+
"@tailwindcss/vite": "{{versions.tailwindcssVite}}",
|
|
115
|
+
"tailwindcss": "{{versions.tailwindcss}}",
|
|
116
|
+
"daisyui": "{{versions.daisyui}}",
|
|
117
|
+
"@iconify-json/tabler": "{{versions.iconifyJsonTabler}}",
|
|
118
|
+
"@iconify/tailwind4": "{{versions.iconifyTailwind}}"{{/if}}{{#if hasI18n}},
|
|
119
|
+
"@inlang/paraglide-js": "{{versions.inlangParaglide}}",
|
|
120
|
+
"@inlang/plugin-message-format": "{{versions.inlangMessageFormat}}"{{/if}}
|
|
121
|
+
}
|
|
125
122
|
}
|
|
@@ -3,6 +3,32 @@
|
|
|
3
3
|
shellEmulator: true
|
|
4
4
|
|
|
5
5
|
trustPolicy: no-downgrade
|
|
6
|
+
# 上游构建工具仍要求 4.x;4.0.3 tarball 已核对原 lockfile 的 SHA-512。
|
|
7
|
+
trustPolicyExclude:
|
|
8
|
+
- chokidar@4.0.3
|
|
9
|
+
|
|
10
|
+
# pnpm 12 配置;原生依赖仅运行明确列出的安装脚本。
|
|
11
|
+
nodeLinker: hoisted
|
|
12
|
+
allowBuilds:
|
|
13
|
+
cpu-features: true
|
|
14
|
+
onnxruntime-node: true
|
|
15
|
+
protobufjs: true
|
|
16
|
+
ssh2: true
|
|
17
|
+
vue-demi: true
|
|
18
|
+
better-sqlite3: true
|
|
19
|
+
esbuild: true
|
|
20
|
+
core-js: false
|
|
21
|
+
|
|
22
|
+
overrides:
|
|
23
|
+
"@ai-sdk/provider-utils@>=4.0.0 <4.0.33": 4.0.57
|
|
24
|
+
cookie@<0.7.0: 0.7.2
|
|
25
|
+
esbuild@<0.28.1: 0.28.2
|
|
26
|
+
katex@<0.18.2: 0.18.10
|
|
27
|
+
sharp@<0.35.5: 0.35.5
|
|
28
|
+
tinypool@<2.1.2: 2.2.0
|
|
29
|
+
'@qdrant/js-client-rest>undici': 7.30.0
|
|
30
|
+
xcode>uuid: 11.1.1
|
|
31
|
+
"@types/node": "{{versions.nodeTypes}}"
|
|
6
32
|
|
|
7
33
|
packages:
|
|
8
34
|
- .
|
|
@@ -6,6 +6,10 @@ import '@h-ai/ui/auto-import'
|
|
|
6
6
|
{{/if}}
|
|
7
7
|
declare global {
|
|
8
8
|
namespace App {
|
|
9
|
+
interface PageData {
|
|
10
|
+
/** 经服务端 core 解析后可公开的应用配置 */
|
|
11
|
+
appConfig: Pick<import('@h-ai/core').CoreConfig, 'name' | 'version' | 'env' | 'defaultLocale'>
|
|
12
|
+
}
|
|
9
13
|
interface Locals {
|
|
10
14
|
/** 请求 ID */
|
|
11
15
|
requestId: string
|
|
@@ -10,19 +10,11 @@ import { paraglideMiddleware } from '$lib/paraglide/server.js'
|
|
|
10
10
|
{{/if}}
|
|
11
11
|
import { initApp } from '$lib/server/init.js'
|
|
12
12
|
import { core } from '@h-ai/core'
|
|
13
|
-
{{#if features.crypto}}
|
|
14
|
-
import { crypto } from '@h-ai/crypto'
|
|
15
|
-
{{/if}}
|
|
16
13
|
{{#if features.iam}}
|
|
17
14
|
import { iam } from '@h-ai/iam'
|
|
18
15
|
{{/if}}
|
|
19
16
|
import { kit } from '@h-ai/kit'
|
|
20
17
|
|
|
21
|
-
{{#if features.crypto}}
|
|
22
|
-
// 初始化加密模块(同步)
|
|
23
|
-
crypto.init()
|
|
24
|
-
|
|
25
|
-
{{/if}}
|
|
26
18
|
// =============================================================================
|
|
27
19
|
// 应用初始化
|
|
28
20
|
// =============================================================================
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
{{#if features.ai}}
|
|
31
31
|
import type { AIConfigInput } from '@h-ai/ai'
|
|
32
32
|
{{/if}}
|
|
33
|
+
{{#if features.audit}}
|
|
34
|
+
import type { AuditInitConfigInput } from '@h-ai/audit'
|
|
35
|
+
{{/if}}
|
|
36
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
33
37
|
{{#if features.iam}}
|
|
34
38
|
import type { IamConfigSettingsInput } from '@h-ai/iam'
|
|
35
39
|
{{/if}}
|
|
@@ -43,12 +47,15 @@ import type { StorageConfigInput } from '@h-ai/storage'
|
|
|
43
47
|
import { ai } from '@h-ai/ai'
|
|
44
48
|
{{/if}}
|
|
45
49
|
{{#if features.audit}}
|
|
46
|
-
import { audit } from '@h-ai/audit'
|
|
50
|
+
import { audit, AuditInitConfigSchema } from '@h-ai/audit'
|
|
47
51
|
{{/if}}
|
|
48
52
|
{{#if features.cache}}
|
|
49
53
|
import { cache, CacheConfigSchema } from '@h-ai/cache'
|
|
50
54
|
{{/if}}
|
|
51
55
|
import { core } from '@h-ai/core'
|
|
56
|
+
{{#if features.crypto}}
|
|
57
|
+
import { crypto } from '@h-ai/crypto'
|
|
58
|
+
{{/if}}
|
|
52
59
|
{{#if features.iam}}
|
|
53
60
|
import { iam } from '@h-ai/iam'
|
|
54
61
|
{{/if}}
|
|
@@ -81,9 +88,15 @@ export async function initApp(): Promise<void> {
|
|
|
81
88
|
// 1. 加载配置
|
|
82
89
|
core.init({
|
|
83
90
|
configDir: './config',
|
|
84
|
-
logging: { level: 'info' },
|
|
85
91
|
})
|
|
86
92
|
|
|
93
|
+
{{#if features.crypto}}
|
|
94
|
+
// 加密模块初始化完成后才继续启动依赖它的 IAM / transport。
|
|
95
|
+
const cryptoResult = await crypto.init()
|
|
96
|
+
if (!cryptoResult.success)
|
|
97
|
+
throw new Error(`Crypto initialization failed: ${cryptoResult.error.message}`)
|
|
98
|
+
{{/if}}
|
|
99
|
+
|
|
87
100
|
{{#if features.db}}
|
|
88
101
|
// ─── 配置校验 ───
|
|
89
102
|
const dbValidation = core.config.validate('db', ReldbConfigSchema)
|
|
@@ -97,6 +110,11 @@ export async function initApp(): Promise<void> {
|
|
|
97
110
|
throw new Error(`Cache config invalid: ${cacheValidation.error.message}`)
|
|
98
111
|
}
|
|
99
112
|
{{/if}}
|
|
113
|
+
{{#if features.audit}}
|
|
114
|
+
const auditValidation = core.config.validate('audit', AuditInitConfigSchema)
|
|
115
|
+
if (!auditValidation.success)
|
|
116
|
+
throw new Error(`Audit config invalid: ${auditValidation.error.message}`)
|
|
117
|
+
{{/if}}
|
|
100
118
|
|
|
101
119
|
{{#if features.db}}
|
|
102
120
|
// ─── 获取配置 ───
|
|
@@ -108,6 +126,9 @@ export async function initApp(): Promise<void> {
|
|
|
108
126
|
{{#if features.iam}}
|
|
109
127
|
const iamConfig = core.config.getOrThrow<IamConfigSettingsInput>('iam')
|
|
110
128
|
{{/if}}
|
|
129
|
+
{{#if features.audit}}
|
|
130
|
+
const auditConfig = core.config.getOrThrow<AuditInitConfigInput>('audit')
|
|
131
|
+
{{/if}}
|
|
111
132
|
{{#if features.storage}}
|
|
112
133
|
const storageConfig = core.config.get<StorageConfigInput>('storage')
|
|
113
134
|
{{/if}}
|
|
@@ -177,9 +198,9 @@ export async function initApp(): Promise<void> {
|
|
|
177
198
|
|
|
178
199
|
{{#if features.audit}}
|
|
179
200
|
// ─── 初始化审计 ───
|
|
180
|
-
const auditResult = await audit.init()
|
|
201
|
+
const auditResult = await audit.init(auditConfig)
|
|
181
202
|
if (!auditResult.success) {
|
|
182
|
-
|
|
203
|
+
throw new Error(`Audit initialization failed: ${auditResult.error.message}`)
|
|
183
204
|
}
|
|
184
205
|
{{/if}}
|
|
185
206
|
|
|
@@ -194,5 +215,5 @@ export async function initApp(): Promise<void> {
|
|
|
194
215
|
{{/if}}
|
|
195
216
|
|
|
196
217
|
initialized = true
|
|
197
|
-
core.logger.info('{
|
|
218
|
+
core.logger.info('Application initialized', { app: core.config.getOrThrow<CoreConfig>('core').name })
|
|
198
219
|
}
|