@h-ai/cli 0.1.0-alpha.10

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 (109) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +167 -0
  3. package/dist/chunk-2H7UOFLK.js +10 -0
  4. package/dist/chunk-2H7UOFLK.js.map +1 -0
  5. package/dist/chunk-LANIDJC7.js +659 -0
  6. package/dist/chunk-LANIDJC7.js.map +1 -0
  7. package/dist/chunk-YV7WPUI6.js +206 -0
  8. package/dist/chunk-YV7WPUI6.js.map +1 -0
  9. package/dist/config-templates-S5RI2MC6.js +5 -0
  10. package/dist/config-templates-S5RI2MC6.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +1650 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/skill-templates-N5DU5FNX.js +5 -0
  15. package/dist/skill-templates-N5DU5FNX.js.map +1 -0
  16. package/dist/src-XJ6YXNAF.js +15030 -0
  17. package/dist/src-XJ6YXNAF.js.map +1 -0
  18. package/package.json +59 -0
  19. package/templates/README.md +126 -0
  20. package/templates/apps/admin/messages/en-US.json +33 -0
  21. package/templates/apps/admin/messages/zh-CN.json +33 -0
  22. package/templates/apps/admin/src/routes/+layout.svelte.hbs +30 -0
  23. package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -0
  24. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +44 -0
  25. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +45 -0
  26. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +37 -0
  27. package/templates/apps/admin/src/routes/api/health/+server.ts +12 -0
  28. package/templates/apps/android-app/.env.hbs +3 -0
  29. package/templates/apps/android-app/capacitor.config.ts.hbs +12 -0
  30. package/templates/apps/android-app/messages/en-US.json +24 -0
  31. package/templates/apps/android-app/messages/zh-CN.json +24 -0
  32. package/templates/apps/android-app/src/lib/api.ts.hbs +30 -0
  33. package/templates/apps/android-app/src/lib/capacitor.ts +21 -0
  34. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +42 -0
  35. package/templates/apps/android-app/src/routes/+layout.ts +7 -0
  36. package/templates/apps/android-app/src/routes/+page.svelte.hbs +27 -0
  37. package/templates/apps/api/src/routes/+layout.svelte +14 -0
  38. package/templates/apps/api/src/routes/+page.svelte +11 -0
  39. package/templates/apps/api/src/routes/api/v1/health/+server.ts +14 -0
  40. package/templates/apps/api/src/routes/api/v1/items/+server.ts +37 -0
  41. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +30 -0
  42. package/templates/apps/h5/messages/en-US.json +37 -0
  43. package/templates/apps/h5/messages/zh-CN.json +37 -0
  44. package/templates/apps/h5/src/routes/+layout.svelte.hbs +57 -0
  45. package/templates/apps/h5/src/routes/+page.svelte.hbs +27 -0
  46. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +27 -0
  47. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +27 -0
  48. package/templates/apps/website/messages/en-US.json +32 -0
  49. package/templates/apps/website/messages/zh-CN.json +32 -0
  50. package/templates/apps/website/src/routes/+layout.svelte.hbs +66 -0
  51. package/templates/apps/website/src/routes/+page.svelte.hbs +33 -0
  52. package/templates/apps/website/src/routes/about/+page.svelte.hbs +27 -0
  53. package/templates/apps/website/src/routes/api/health/+server.ts +12 -0
  54. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +59 -0
  55. package/templates/apps/website/src/routes/services/+page.svelte.hbs +63 -0
  56. package/templates/base/e2e/helpers.ts +49 -0
  57. package/templates/base/package.json.hbs +67 -0
  58. package/templates/base/playwright.config.ts +32 -0
  59. package/templates/base/src/app.css +2 -0
  60. package/templates/base/src/app.d.ts.hbs +18 -0
  61. package/templates/base/src/app.html.hbs +16 -0
  62. package/templates/base/src/hooks.server.ts.hbs +123 -0
  63. package/templates/base/src/lib/server/init.ts.hbs +190 -0
  64. package/templates/base/svelte.config.js.hbs +30 -0
  65. package/templates/base/tsconfig.json +8 -0
  66. package/templates/base/vite.config.ts.hbs +27 -0
  67. package/templates/features/ai/routes/api/chat/+server.ts +26 -0
  68. package/templates/features/datapipe/routes/api/datapipe/pipeline/+server.ts +41 -0
  69. package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +21 -0
  70. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +98 -0
  71. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +124 -0
  72. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +98 -0
  73. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +114 -0
  74. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +32 -0
  75. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +15 -0
  76. package/templates/features/iam/routes-shared/api/auth/me/+server.ts +12 -0
  77. package/templates/features/iam/routes-shared/api/auth/register/+server.ts +26 -0
  78. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +30 -0
  79. package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +42 -0
  80. package/templates/features/payment/routes/api/v1/payment/query/[orderNo]/+server.ts +25 -0
  81. package/templates/features/storage/routes/api/upload/+server.ts +35 -0
  82. package/templates/features/vecdb/routes/api/vecdb/search/+server.ts +36 -0
  83. package/templates/i18n/project.inlang/settings.json +11 -0
  84. package/templates/skills/AGENTS.md +26 -0
  85. package/templates/skills/CLAUDE.md +12 -0
  86. package/templates/skills/copilot-instructions.md +61 -0
  87. package/templates/skills/hai-ai/SKILL.md +721 -0
  88. package/templates/skills/hai-api-client/SKILL.md +355 -0
  89. package/templates/skills/hai-app-create/SKILL.md +371 -0
  90. package/templates/skills/hai-app-review/SKILL.md +156 -0
  91. package/templates/skills/hai-app-tests/SKILL.md +468 -0
  92. package/templates/skills/hai-audit/SKILL.md +145 -0
  93. package/templates/skills/hai-build/SKILL.md +319 -0
  94. package/templates/skills/hai-cache/SKILL.md +190 -0
  95. package/templates/skills/hai-capacitor/SKILL.md +377 -0
  96. package/templates/skills/hai-core/SKILL.md +484 -0
  97. package/templates/skills/hai-crypto/SKILL.md +198 -0
  98. package/templates/skills/hai-datapipe/SKILL.md +220 -0
  99. package/templates/skills/hai-deploy/SKILL.md +216 -0
  100. package/templates/skills/hai-iam/SKILL.md +361 -0
  101. package/templates/skills/hai-kit/SKILL.md +484 -0
  102. package/templates/skills/hai-payment/SKILL.md +275 -0
  103. package/templates/skills/hai-reach/SKILL.md +315 -0
  104. package/templates/skills/hai-reldb/SKILL.md +465 -0
  105. package/templates/skills/hai-scheduler/SKILL.md +188 -0
  106. package/templates/skills/hai-storage/SKILL.md +276 -0
  107. package/templates/skills/hai-ui/SKILL.md +438 -0
  108. package/templates/skills/hai-vecdb/SKILL.md +279 -0
  109. package/templates/skills/opencode.json +11 -0
@@ -0,0 +1,355 @@
1
+ ---
2
+ name: hai-api-client
3
+ description: 使用 @h-ai/api-client 单例模式构建多端共用的纯 TypeScript HTTP 客户端,通过 api.init() 初始化,支持 Bearer Token 自动管理、401 刷新重试、契约调用(EndpointDef)与流式响应;当需求涉及客户端 API 请求、Token 管理、契约调用或多端数据层时使用。
4
+ ---
5
+
6
+ # hai-api-client
7
+
8
+ > `@h-ai/api-client` 是 hai-framework 的纯 TypeScript HTTP 客户端,多端共用(Web/H5/Android),基于 fetch API 实现。以单例模式暴露 `api` 对象,通过 `api.init()` 初始化。核心能力:Token 自动附加、401 自动刷新重试、基于 EndpointDef 的类型安全契约调用。
9
+
10
+ ---
11
+
12
+ ## 运行环境
13
+
14
+ **浏览器端专用。** 服务端 `+page.server.ts` / `+server.ts` 应直接调用模块 API(如 `iam.auth.login()`),不经过 HTTP 自环。
15
+
16
+ ### 与 kit.client 的分工
17
+
18
+ | 场景 | 推荐 | 原因 |
19
+ |------|------|------|
20
+ | SSR SvelteKit 应用(同源请求) | `kit.client.create().apiFetch`(见 hai-kit SKILL) | 自动 CSRF、传输加密、同源 Cookie 透传 |
21
+ | SPA / 原生 App(跨域请求) | **本模块** `api.init()` + `api.call()` | 完整 Token 管理、401 自动刷新、独立 baseUrl |
22
+ | 契约调用(类型安全,跨域) | **本模块** `api.call(endpoint, input)` | EndpointDef 双向 Zod 校验 |
23
+
24
+ ---
25
+
26
+ ## 适用场景
27
+
28
+ - 浏览器端/App 端统一 API 请求
29
+ - Bearer Token 自动管理(存储、附加、刷新)
30
+ - 基于 EndpointDef 契约的类型安全调用
31
+ - 流式响应(SSE / ReadableStream)
32
+ - 拦截器(请求/响应前后处理)
33
+
34
+ ---
35
+
36
+ ## 使用步骤
37
+
38
+ ### 1. 初始化客户端
39
+
40
+ ```typescript
41
+ import { api } from '@h-ai/api-client'
42
+
43
+ // 应用启动时初始化
44
+ await api.init({
45
+ baseUrl: 'http://localhost:3000',
46
+ auth: {
47
+ refreshUrl: '/auth/refresh',
48
+ // Token 刷新失败回调(可选,常用于跳转登录页)
49
+ onRefreshFailed: () => {
50
+ window.location.href = '/login'
51
+ },
52
+ },
53
+ timeout: 15000,
54
+ })
55
+ ```
56
+
57
+ > `auth.storage` 可选:默认使用 `createLocalStorageTokenStorage()`;SSR/测试建议显式传 `createMemoryTokenStorage()`,App 端建议传 `createCapacitorTokenStorage()`。
58
+
59
+ ### 2. 普通请求
60
+
61
+ ```typescript
62
+ // GET 请求
63
+ const users = await api.get<User[]>('/api/v1/users')
64
+
65
+ // POST 请求
66
+ const result = await api.post<CreateResult>('/api/v1/users', {
67
+ username: 'alice',
68
+ email: 'alice@example.com',
69
+ })
70
+
71
+ // 带查询参数(直接传入 Record<string, unknown>)
72
+ const page = await api.get<PageResult>('/api/v1/users', { page: 1, pageSize: 20 })
73
+ ```
74
+
75
+ ### 3. 契约调用(推荐)
76
+
77
+ ```typescript
78
+ import { iamEndpoints } from '@h-ai/iam/api'
79
+
80
+ // 类型安全:入参和返回值由 EndpointDef 的 Zod schema 推导,入参/出参双向校验
81
+ const loginResult = await api.call(iamEndpoints.login, {
82
+ identifier: 'admin',
83
+ password: 'StrongPassword123',
84
+ })
85
+
86
+ if (loginResult.success) {
87
+ // loginResult.data 类型自动推导为 { user, tokens, agreements? }
88
+ await api.auth.setTokens(loginResult.data.tokens)
89
+ }
90
+ ```
91
+
92
+ ### 4. Token 管理
93
+
94
+ ```typescript
95
+ // 手动设置 Token(登录后)
96
+ await api.auth.setTokens({
97
+ accessToken: 'xxx',
98
+ refreshToken: 'yyy',
99
+ expiresIn: 3600,
100
+ tokenType: 'Bearer',
101
+ })
102
+
103
+ // 清除 Token(登出)
104
+ await api.auth.clear()
105
+
106
+ // 监听 Token 刷新
107
+ api.auth.onTokenRefreshed((tokens) => {
108
+ // tokens 包含新的 accessToken / refreshToken
109
+ })
110
+ ```
111
+
112
+ ### 5. 流式响应
113
+
114
+ ```typescript
115
+ const controller = new AbortController()
116
+
117
+ // stream(path, body?, options?) — 返回 AsyncIterable<string>,按 SSE data: 行 yield
118
+ for await (const chunk of api.stream('/api/v1/ai/chat', { message: 'Hello' }, { signal: controller.signal })) {
119
+ // 每个 chunk 是 SSE data: 行的内容
120
+ }
121
+
122
+ // 主动停止
123
+ controller.abort()
124
+ ```
125
+
126
+ ### 6. 关闭
127
+
128
+ ```typescript
129
+ await api.close()
130
+ ```
131
+
132
+ ---
133
+
134
+ ## 核心 API
135
+
136
+ | API | 用途 | 关键点 |
137
+ | ---------------------------------- | -------------- | ------------------------------------- |
138
+ | `api.init(config)` | 初始化客户端 | 返回 `HaiResult<void>` |
139
+ | `api.close()` | 关闭并释放资源 | 重复调用安全 |
140
+ | `api.isInitialized` | 初始化状态 | `boolean` |
141
+ | `api.config` | 当前配置 | 未初始化时为 `null` |
142
+ | `api.get<T>(path, params?)` | GET 请求 | params 附加到 URL query string |
143
+ | `api.post<T>(path, body?)` | POST 请求 | body 自动 JSON 序列化 |
144
+ | `api.put<T>(path, body?)` | PUT 请求 | — |
145
+ | `api.patch<T>(path, body?)` | PATCH 请求 | — |
146
+ | `api.delete<T>(path, params?)` | DELETE 请求 | params 附加到 URL query string |
147
+ | `api.call(endpoint, input)` | 契约调用 | 入参/出参 Zod 双向校验,路径/方法由契约决定 |
148
+ | `api.upload(path, file, options?)` | 文件上传 | FormData,支持附加字段 |
149
+ | `api.stream(path, body?)` | 流式请求 | 返回 AsyncIterable<string>(SSE) |
150
+ | `api.auth.setTokens(tokens)` | 设置 Token | 存入 TokenStorage |
151
+ | `api.auth.clear()` | 清空 Token | 清空存储 |
152
+ | `api.auth.onTokenRefreshed(cb)` | 刷新回调 | 返回取消订阅函数,Token 自动刷新成功时通知 |
153
+
154
+ ### EndpointDef 契约结构
155
+
156
+ ```typescript
157
+ interface EndpointDef<TInput, TOutput> {
158
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
159
+ path: string
160
+ input: ZodSchema<TInput>
161
+ output: ZodSchema<TOutput>
162
+ requireAuth?: boolean
163
+ meta?: { summary?: string; tags?: string[] }
164
+ }
165
+ ```
166
+
167
+ ### TokenStorage 接口
168
+
169
+ ```typescript
170
+ interface TokenStorage {
171
+ getAccessToken: () => Promise<string | null>
172
+ setAccessToken: (token: string) => Promise<void>
173
+ getRefreshToken: () => Promise<string | null>
174
+ setRefreshToken: (token: string) => Promise<void>
175
+ clear: () => Promise<void>
176
+ }
177
+ ```
178
+
179
+ 内置实现:`createLocalStorageTokenStorage()`(Web)、`createMemoryTokenStorage()`(SSR/测试)。
180
+ App 端使用 `@h-ai/capacitor` 的 `createCapacitorTokenStorage()`。
181
+
182
+ ---
183
+
184
+ ## 错误码 — `HaiApiClientError`
185
+
186
+ | 错误码 | code | 说明 |
187
+ |--------|------|------|
188
+ | `HaiApiClientError.NETWORK_ERROR` | `hai:api-client:001` | 网络不可达 |
189
+ | `HaiApiClientError.TIMEOUT` | `hai:api-client:002` | 请求超时 |
190
+ | `HaiApiClientError.SERVER_ERROR` | `hai:api-client:003` | 5xx 服务端错误 |
191
+ | `HaiApiClientError.UNAUTHORIZED` | `hai:api-client:004` | 401 未认证 |
192
+ | `HaiApiClientError.FORBIDDEN` | `hai:api-client:005` | 403 无权限 |
193
+ | `HaiApiClientError.NOT_FOUND` | `hai:api-client:006` | 404 资源不存在 |
194
+ | `HaiApiClientError.VALIDATION_FAILED` | `hai:api-client:007` | 请求参数校验失败 |
195
+ | `HaiApiClientError.TOKEN_REFRESH_FAILED` | `hai:api-client:008` | Token 刷新失败 |
196
+ | `HaiApiClientError.NOT_INITIALIZED` | `hai:api-client:010` | 未初始化 |
197
+ | `HaiApiClientError.CONFIG_ERROR` | `hai:api-client:011` | 配置错误 |
198
+ | `HaiApiClientError.UNKNOWN` | `hai:api-client:099` | 未知错误 |
199
+
200
+ ---
201
+
202
+ ## API 契约范式(端到端类型安全)
203
+
204
+ > `@h-ai/api-client` 和 `@h-ai/kit` 共同消费模块 `api/` 下的 `EndpointDef` 定义,实现客户端↔服务端的全链路类型安全 + 运行时 Zod 校验。
205
+
206
+ ### 契约架构
207
+
208
+ ```
209
+ ┌─────────────────────────────────────────────────────────────┐
210
+ │ @h-ai/xx/api │
211
+ │ xx-api-schemas.ts ← Zod Schema(唯一真相源) │
212
+ │ xx-api-contract.ts ← xxEndpoints(method + path + schema)│
213
+ └─────────────┬──────────────────────────┬────────────────────┘
214
+ │ │
215
+ ┌────────▼────────┐ ┌─────────▼─────────┐
216
+ │ 客户端(浏览器)│ │ 服务端(SvelteKit)│
217
+ │ api.call(ep, i) │ │ kit.fromContract │
218
+ │ @h-ai/api-client│ │ @h-ai/kit │
219
+ └────────┬────────┘ └─────────┬─────────┘
220
+ │ HTTP(类型安全) │
221
+ └──────────────────────────┘
222
+ ```
223
+
224
+ ### 客户端流程(本模块责任)
225
+
226
+ 1. 从 `@h-ai/xx/api` 导入 `xxEndpoints`
227
+ 2. `api.call(xxEndpoints.xxx, input)` → Zod 校验入参 → 按 method/path 发起 HTTP → Zod 校验出参
228
+ 3. 入参或出参校验失败均返回 `VALIDATION_FAILED`(1206)
229
+ 4. 返回 `HaiResult<TOutput>`
230
+
231
+ ```typescript
232
+ import { storageEndpoints } from '@h-ai/storage/api'
233
+ import { iamEndpoints } from '@h-ai/iam/api'
234
+ import { aiEndpoints } from '@h-ai/ai/api'
235
+
236
+ // 存储:获取上传签名 URL
237
+ const upload = await api.call(storageEndpoints.presignUpload, {
238
+ key: 'avatars/user-1.png',
239
+ contentType: 'image/png',
240
+ })
241
+
242
+ // IAM:登录
243
+ const login = await api.call(iamEndpoints.login, {
244
+ username: 'admin',
245
+ password: 'xxx',
246
+ })
247
+
248
+ // AI:发送消息
249
+ const chat = await api.call(aiEndpoints.sendMessage, {
250
+ conversationId: 'conv-1',
251
+ content: 'Hello',
252
+ })
253
+ ```
254
+
255
+ ### 已有契约模块一览
256
+
257
+ | 模块 | 导入路径 | 端点对象 | 典型端点 |
258
+ | ---------- | -------------------- | -------------------- | ------------------------------- |
259
+ | `storage` | `@h-ai/storage/api` | `storageEndpoints` | presignUpload, listFiles, … |
260
+ | `iam` | `@h-ai/iam/api` | `iamEndpoints` | login, logout, currentUser, … |
261
+ | `ai` | `@h-ai/ai/api` | `aiEndpoints` | chat, chatStream, sendMessage |
262
+ | `payment` | `@h-ai/payment/api` | `paymentEndpoints` | createOrder, queryOrder, … |
263
+
264
+
265
+ ## 常见模式
266
+
267
+ ### 与 @h-ai/iam/api 契约配合
268
+
269
+ ```typescript
270
+ import { iamEndpoints } from '@h-ai/iam/api'
271
+
272
+ // 登录(入参字段为 identifier + password)
273
+ const login = await api.call(iamEndpoints.login, { identifier, password })
274
+ if (login.success) {
275
+ // login.data 类型:{ user, tokens, agreements? }
276
+ await api.auth.setTokens(login.data.tokens)
277
+ }
278
+
279
+ // 获取当前用户(自动携带 Bearer Token)
280
+ const me = await api.call(iamEndpoints.currentUser, {})
281
+ // me.data 类型:{ user, roles, permissions }
282
+
283
+ // 修改密码
284
+ await api.call(iamEndpoints.changePassword, { oldPassword, newPassword })
285
+
286
+ // 登出
287
+ const accessToken = '...' // 从 Token 存储获取
288
+ await api.call(iamEndpoints.logout, { accessToken })
289
+ await api.auth.clear()
290
+ ```
291
+
292
+ #### 401 自动刷新机制
293
+
294
+ 当请求收到 401 响应时,客户端自动执行:
295
+
296
+ 1. 使用存储的 `refreshToken` 调用 `auth.refreshUrl`(POST)
297
+ 2. 刷新成功 → 更新存储 → 用新 Token 重试原请求(仅重试一次)
298
+ 3. 刷新失败 → 清空 Token → 触发 `onRefreshFailed` 回调
299
+ 4. 多个并发 401 → **自动去重**,只发一次刷新请求
300
+
301
+ > 流式请求(`api.stream()`)同样支持 401 自动刷新 + 重试。
302
+
303
+ #### 可用的 IAM 端点
304
+
305
+ | 分类 | 端点 | 方法 | 路径 | 认证 |
306
+ |------|------|------|------|------|
307
+ | 认证 | `iamEndpoints.login` | POST | /auth/login | 否 |
308
+ | | `iamEndpoints.loginWithOtp` | POST | /auth/login/otp | 否 |
309
+ | | `iamEndpoints.logout` | POST | /auth/logout | 是 |
310
+ | | `iamEndpoints.currentUser` | GET | /auth/me | 是 |
311
+ | | `iamEndpoints.refreshToken` | POST | /auth/refresh | 否 |
312
+ | | `iamEndpoints.sendOtp` | POST | /auth/otp/send | 否 |
313
+ | | `iamEndpoints.register` | POST | /auth/register | 否 |
314
+ | | `iamEndpoints.changePassword` | POST | /auth/change-password | 是 |
315
+ | | `iamEndpoints.updateCurrentUser` | PUT | /auth/me | 是 |
316
+ | 用户管理 | `iamEndpoints.listUsers` | GET | /iam/users | 是 |
317
+ | | `iamEndpoints.getUser` | GET | /iam/users/:id | 是 |
318
+ | | `iamEndpoints.createUser` | POST | /iam/users | 是 |
319
+ | | `iamEndpoints.updateUser` | PUT | /iam/users/:id | 是 |
320
+ | | `iamEndpoints.deleteUser` | DELETE | /iam/users/:id | 是 |
321
+ | | `iamEndpoints.adminResetPassword` | POST | /iam/users/:id/reset-password | 是 |
322
+ | 角色管理 | `iamEndpoints.listRoles` | GET | /iam/roles | 是 |
323
+ | | `iamEndpoints.getRole` | GET | /iam/roles/:id | 是 |
324
+ | | `iamEndpoints.createRole` | POST | /iam/roles | 是 |
325
+ | | `iamEndpoints.updateRole` | PUT | /iam/roles/:id | 是 |
326
+ | | `iamEndpoints.deleteRole` | DELETE | /iam/roles/:id | 是 |
327
+ | 权限管理 | `iamEndpoints.listPermissions` | GET | /iam/permissions | 是 |
328
+ | | `iamEndpoints.getPermission` | GET | /iam/permissions/:id | 是 |
329
+ | | `iamEndpoints.createPermission` | POST | /iam/permissions | 是 |
330
+ | | `iamEndpoints.deletePermission` | DELETE | /iam/permissions/:id | 是 |
331
+
332
+ ### Android App 中使用
333
+
334
+ ```typescript
335
+ import { api } from '@h-ai/api-client'
336
+ import { createCapacitorTokenStorage } from '@h-ai/capacitor'
337
+
338
+ // 应用启动时初始化
339
+ await api.init({
340
+ baseUrl: import.meta.env.PUBLIC_API_BASE,
341
+ auth: {
342
+ storage: createCapacitorTokenStorage(),
343
+ refreshUrl: '/api/v1/auth/refresh',
344
+ },
345
+ })
346
+ ```
347
+
348
+ ---
349
+
350
+ ## 相关 Skills
351
+
352
+ - `hai-iam`:认证契约定义(iamEndpoints)
353
+ - `hai-capacitor`:原生 Token 存储
354
+ - `hai-kit`:服务端契约处理(kit.fromContract)
355
+ - `hai-core`:HaiResult 类型、错误处理基础