@h-ai/api-client 0.1.0-alpha.13 → 0.1.0-alpha.16

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/dist/index.d.ts CHANGED
@@ -1,7 +1,23 @@
1
1
  import * as _h_ai_core from '@h-ai/core';
2
2
  import { HaiResult } from '@h-ai/core';
3
- import { z } from 'zod';
3
+ import { CryptoFunctions } from '@h-ai/crypto';
4
+ import * as _orpc_contract from '@orpc/contract';
5
+ import { AnyContractRouter, ContractRouterClient } from '@orpc/contract';
6
+ import { JsonifiedClient } from '@orpc/openapi-client';
7
+ import * as _h_ai_api_contract from '@h-ai/api-contract';
8
+ import * as zod_v4_core from 'zod/v4/core';
9
+ import * as zod from 'zod';
4
10
 
11
+ /**
12
+ * API client 标准错误集合(遵循 `@h-ai/core` 错误码规范)。
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * if (!result.success && result.error.code === HaiApiClientError.UNAUTHORIZED.code) {
17
+ * redirectToLogin()
18
+ * }
19
+ * ```
20
+ */
5
21
  declare const HaiApiClientError: {
6
22
  readonly NETWORK_ERROR: _h_ai_core.HaiErrorDef;
7
23
  readonly TIMEOUT: _h_ai_core.HaiErrorDef;
@@ -15,334 +31,1602 @@ declare const HaiApiClientError: {
15
31
  readonly CONFIG_ERROR: _h_ai_core.HaiErrorDef;
16
32
  readonly UNKNOWN: _h_ai_core.HaiErrorDef;
17
33
  };
18
- /**
19
- * API 端点契约定义
20
- *
21
- * 描述单个 API 端点的 HTTP 方法、路径、入参/出参 Schema 与元数据。
22
- * 客户端通过 `api.call(endpoint, input)` 调用,服务端通过
23
- * `kit.fromContract(endpoint, handler)` 响应,两端共享同一份契约。
24
- *
25
- * @typeParam TInput - 入参类型(由 Zod Schema 推导)
26
- * @typeParam TOutput - 出参类型(由 Zod Schema 推导)
27
- *
28
- * @example
29
- * ```ts
30
- * const loginEndpoint: EndpointDef<LoginInput, LoginOutput> = {
31
- * method: 'POST',
32
- * path: '/auth/login',
33
- * input: LoginInputSchema,
34
- * output: LoginOutputSchema,
35
- * requireAuth: false,
36
- * }
37
- * ```
38
- */
39
- interface EndpointDef<TInput = unknown, TOutput = unknown> {
40
- /** HTTP 方法 */
41
- method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
42
- /** 相对路径(相对于 API 前缀,如 '/auth/login') */
43
- path: string;
44
- /** 入参 Zod Schema(GET 请求为 query params,其他为 body) */
45
- input: z.ZodType<TInput>;
46
- /** 出参 Zod Schema */
47
- output: z.ZodType<TOutput>;
48
- /** 是否需要认证(默认 true) */
49
- requireAuth?: boolean;
50
- /** OpenAPI 描述元数据 */
51
- meta?: {
52
- summary?: string;
53
- tags?: string[];
54
- };
55
- }
56
- /**
57
- * Token 对(与 @h-ai/iam 的 TokenPair 对齐)
58
- */
34
+ /** Token 对(与 `@h-ai/iam` 的 TokenPair 对齐)。 */
59
35
  interface TokenPair {
60
- /** Access Token */
61
- accessToken: string;
62
- /** Refresh Token */
63
- refreshToken: string;
64
- /** 过期时间(秒) */
65
- expiresIn: number;
66
- /** Token 类型 */
67
- tokenType: 'Bearer';
36
+ /** 短期访问凭证,请求时作为 `Authorization: Bearer ...`。 */
37
+ readonly accessToken: string;
38
+ /** 长期刷新凭证;httpOnly cookie 模式下由服务端管理,响应体中可能不存在。 */
39
+ readonly refreshToken?: string;
40
+ /** accessToken 有效期秒数。 */
41
+ readonly expiresIn: number;
42
+ /** 固定为 `'Bearer'`。 */
43
+ readonly tokenType: 'Bearer';
68
44
  }
69
45
  /**
70
- * Token 存储适配器
46
+ * Token 存储适配器。
47
+ *
48
+ * 内置实现:
49
+ * - `apiClient.tokenStorage.httpOnlyCookie()` — **默认**;浏览器端推荐,refresh token 由服务端管理,防 XSS。
50
+ * - `apiClient.tokenStorage.memory()` — Node.js 测试 / SSR(需显式传入)。
51
+ * - `apiClient.tokenStorage.localStorage()` — 浏览器 SPA / PWA(有 XSS 风险,生产不推荐)。
71
52
  *
72
- * 可插拔存储后端(localStorage / memory / Capacitor Preferences / 自定义)。
53
+ * Capacitor / 小程序场景请由对应模块提供(例如 `@h-ai/capacitor`)。
73
54
  */
74
55
  interface TokenStorage {
75
- /** 获取 Access Token */
76
- getAccessToken: () => Promise<string | null>;
77
- /** 设置 Access Token */
78
- setAccessToken: (token: string) => Promise<void>;
79
- /** 获取 Refresh Token */
80
- getRefreshToken: () => Promise<string | null>;
81
- /** 设置 Refresh Token */
82
- setRefreshToken: (token: string) => Promise<void>;
83
- /** 清空所有 Token */
84
- clear: () => Promise<void>;
56
+ readonly getAccessToken: () => Promise<string | null>;
57
+ readonly setAccessToken: (token: string) => Promise<void>;
58
+ readonly getRefreshToken: () => Promise<string | null>;
59
+ readonly setRefreshToken: (token: string) => Promise<void>;
60
+ readonly clear: () => Promise<void>;
85
61
  }
86
- /**
87
- * 请求配置(传递给拦截器)
88
- */
89
- interface RequestConfig {
90
- /** 完整 URL */
91
- url: string;
92
- /** HTTP 方法 */
93
- method: string;
94
- /** 请求头 */
95
- headers: Record<string, string>;
96
- /** 请求体(已序列化) */
97
- body?: string | FormData;
98
- /** 信号(abort) */
99
- signal?: AbortSignal;
100
- }
101
- /** 请求拦截器 */
102
- type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;
103
- /** 响应拦截器 */
104
- type ResponseInterceptor = (response: Response) => Response | Promise<Response>;
105
- /**
106
- * Token 刷新配置
107
- */
62
+ /** Token 自动刷新配置。 */
108
63
  interface AuthConfig {
109
- /** Token 存储适配器(默认 createLocalStorageTokenStorage) */
110
- storage?: TokenStorage;
111
- /** Refresh Token 接口路径(相对于 baseUrl) */
112
- refreshUrl: string;
113
- /** Token 刷新回调 */
114
- onTokenRefreshed?: (tokens: TokenPair) => void;
115
- /** Token 刷新失败回调(通常用于跳转登录页) */
116
- onRefreshFailed?: () => void;
117
- }
118
- /**
119
- * ApiClient 配置
120
- */
121
- interface ApiClientConfig {
122
- /** API 基础 URL(如 https://api.example.com/api/v1) */
123
- baseUrl: string;
124
- /** Token 认证配置(省略则不启用自动 Token 管理) */
125
- auth?: AuthConfig;
126
- /** 请求超时(毫秒,默认 30000) */
127
- timeout?: number;
128
- /** 拦截器 */
129
- interceptors?: {
130
- request?: RequestInterceptor[];
131
- response?: ResponseInterceptor[];
132
- };
133
- /** 自定义 fetch 实现(用于测试或特殊环境) */
134
- fetch?: typeof globalThis.fetch;
135
- }
136
- /**
137
- * 文件上传选项
138
- */
139
- interface UploadOptions {
140
- /** 文件字段名(默认 'file') */
141
- fieldName?: string;
142
- /** 附加表单字段 */
143
- extraFields?: Record<string, string>;
144
- }
145
- /**
146
- * 流式请求选项
147
- */
148
- interface StreamOptions {
149
- /** 外部取消信号(例如 AbortController.signal) */
150
- signal?: AbortSignal;
151
- }
152
- /**
153
- * Api Client 实例接口
154
- *
155
- * 提供通用 HTTP 方法和契约调用能力。
156
- */
157
- interface ApiClient {
158
- /** GET 请求 */
159
- get: <T>(path: string, params?: Record<string, unknown>) => Promise<HaiResult<T>>;
160
- /** POST 请求 */
161
- post: <T>(path: string, body?: unknown) => Promise<HaiResult<T>>;
162
- /** PUT 请求 */
163
- put: <T>(path: string, body?: unknown) => Promise<HaiResult<T>>;
164
- /** PATCH 请求 */
165
- patch: <T>(path: string, body?: unknown) => Promise<HaiResult<T>>;
166
- /** DELETE 请求 */
167
- delete: <T>(path: string, params?: Record<string, unknown>) => Promise<HaiResult<T>>;
168
- /** 文件上传 */
169
- upload: (path: string, file: File | Blob, options?: UploadOptions) => Promise<HaiResult<unknown>>;
170
- /** 流式请求(返回 AsyncIterable) */
171
- stream: (path: string, body?: unknown, options?: StreamOptions) => AsyncIterable<string>;
172
64
  /**
173
- * 契约调用(推荐)
65
+ * Token 存储适配器;默认 `apiClient.tokenStorage.httpOnlyCookie()`(refresh token 由服务端管理,防 XSS)。
174
66
  *
175
- * 基于 EndpointDef 发起请求,路径、方法、入参、出参类型全由契约保证。
67
+ * - SSR / Node.js 测试场景请显式传入 `apiClient.tokenStorage.memory()`。
68
+ * - 浏览器 SPA 如确需持久化,可显式传 `apiClient.tokenStorage.localStorage()`,
69
+ * 但请先评估 XSS 风险。
70
+ * - Capacitor / 小程序请使用对应平台的安全存储适配器(如 `@h-ai/capacitor`)。
176
71
  */
177
- call: <TInput, TOutput>(endpoint: EndpointDef<TInput, TOutput>, input: TInput) => Promise<HaiResult<TOutput>>;
178
- /** Token 管理 */
179
- auth: {
180
- /** 设置 Token */
181
- setTokens: (tokens: TokenPair) => Promise<void>;
182
- /** 清空 Token */
183
- clear: () => Promise<void>;
184
- /** Token 刷新回调,返回取消订阅函数 */
185
- onTokenRefreshed: (callback: (tokens: TokenPair) => void) => () => void;
186
- };
72
+ readonly storage?: TokenStorage;
73
+ /** 刷新接口路径,相对于 `baseUrl`,默认 `/auth/refresh`。 */
74
+ readonly refreshPath?: string;
75
+ /**
76
+ * 刷新请求超时(ms),默认 10_000。
77
+ * 避免 refresh 接口上游挂死时所有 dedup 调用方一起 hang。
78
+ * 超时后按现有 transient 失败处理(不清 token,下次请求可重试)。
79
+ */
80
+ readonly refreshTimeoutMs?: number;
81
+ /** 刷新成功回调,用于同步状态(例如多 Tab 广播)。 */
82
+ readonly onTokenRefreshed?: (tokens: TokenPair) => void;
83
+ /** 刷新失败回调(如 refresh token 已失效),通常用于跳转登录页。 */
84
+ readonly onRefreshFailed?: () => void;
187
85
  }
188
- /**
189
- * 辅助函数:创建端点定义(获得类型推导)
190
- *
191
- * @example
192
- * ```ts
193
- * const login = defineEndpoint({
194
- * method: 'POST',
195
- * path: '/auth/login',
196
- * input: LoginInputSchema,
197
- * output: LoginOutputSchema,
198
- * requireAuth: false,
199
- * })
200
- * ```
201
- */
202
- declare function defineEndpoint<TInput, TOutput>(def: EndpointDef<TInput, TOutput>): EndpointDef<TInput, TOutput>;
203
- /**
204
- * API 客户端函数接口(单例模式)
205
- *
206
- * 统一的 API 客户端访问入口:
207
- * - `api.init(config)` — 初始化客户端
208
- * - `api.close()` — 关闭客户端并释放资源
209
- * - `api.get / post / put / patch / delete` — 通用 HTTP 方法
210
- * - `api.call(endpoint, input)` — 契约调用
211
- * - `api.upload(path, file)` — 文件上传
212
- * - `api.stream(path, body)` — 流式请求
213
- * - `api.auth` — Token 管理
214
- * - `api.config` — 当前配置(未初始化时为 null)
215
- * - `api.isInitialized` — 初始化状态
216
- */
217
- interface ApiClientFunctions {
86
+ /** API client 初始化配置。 */
87
+ interface ApiClientConfig {
88
+ /** API service 完整 baseUrl,通常含 `apiPrefix`,例如 `https://api.example.com/api/v1`。 */
89
+ readonly baseUrl: string;
90
+ /** 认证配置;不传则不启用 Token 注入与自动刷新。 */
91
+ readonly auth?: AuthConfig;
92
+ /** 请求超时(ms),默认 30000。 */
93
+ readonly timeout?: number;
94
+ /** 客户端标识,写入 `x-request-client` 请求头,默认 `hai-api-client`。 */
95
+ readonly clientName?: string;
96
+ /** 额外请求头,可为静态对象或异步函数。 */
97
+ readonly headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);
98
+ /** 自定义 fetch(测试 mock / Capacitor / 小程序桥接)。 */
99
+ readonly fetch?: typeof globalThis.fetch;
218
100
  /**
219
- * 初始化 API 客户端
101
+ * 启用端到端传输加密(opt-in)。
102
+ *
103
+ * 配置后所有出站请求会在底层 fetch 之上做一次混合加密,并自动解密
104
+ * 标记为 `X-Encrypted: true` 的响应。服务端需启用对应的 `serv.createApp({ transport })`。
220
105
  *
221
- * 已有实例时会先 close 再重新初始化。
106
+ * `crypto` 字段结构与 `@h-ai/crypto` 的 `crypto` 实例兼容;通常直接传入:
222
107
  *
223
- * @param config - 客户端配置
224
- * @returns 成功 ok(undefined);失败返回 err(含 ApiClientError)
108
+ * @example
109
+ * ```ts
110
+ * import { apiClient } from '@h-ai/api-client'
111
+ * import { crypto } from '@h-ai/crypto'
112
+ *
113
+ * await crypto.init()
114
+ * await apiClient.init({
115
+ * baseUrl: 'https://api.example.com/api/v1',
116
+ * transport: { crypto },
117
+ * })
118
+ * ```
119
+ */
120
+ readonly transport?: ApiClientTransportConfig;
121
+ }
122
+ /** {@link ApiClientConfig.transport} 的配置项。 */
123
+ interface ApiClientTransportConfig {
124
+ /**
125
+ * crypto 服务实例(通常直接传入 `@h-ai/crypto` 的 `crypto`)。
126
+ * api-client 通过 `crypto.transport.createClient(...)` 创建会话。
225
127
  */
226
- init: (config: ApiClientConfig) => Promise<HaiResult<void>>;
128
+ readonly crypto: CryptoFunctions;
227
129
  /**
228
- * 关闭 API 客户端并释放资源
130
+ * 密钥协商端点路径,相对于 `baseUrl`,默认 `/_hai/key-exchange`。
229
131
  *
230
- * 重复调用不会报错。
132
+ * 必须与服务端 `serv.createApp({ transport: { keyExchangePath } })` 一致。
231
133
  */
232
- close: () => Promise<void>;
233
- /** 当前客户端配置;未初始化或已关闭时为 null */
234
- readonly config: ApiClientConfig | null;
235
- /** 是否已完成初始化 */
236
- readonly isInitialized: boolean;
237
- /** GET 请求 */
238
- readonly get: ApiClient['get'];
239
- /** POST 请求 */
240
- readonly post: ApiClient['post'];
241
- /** PUT 请求 */
242
- readonly put: ApiClient['put'];
243
- /** PATCH 请求 */
244
- readonly patch: ApiClient['patch'];
245
- /** DELETE 请求 */
246
- readonly delete: ApiClient['delete'];
247
- /** 文件上传 */
248
- readonly upload: ApiClient['upload'];
134
+ readonly keyExchangePath?: string;
135
+ }
136
+ /** Token 辅助操作。 */
137
+ interface ApiClientAuth {
138
+ /** 手动写入 Token(例如登录成功后)。 */
139
+ readonly setTokens: (tokens: TokenPair) => Promise<void>;
140
+ /** 清空存储的 Token(登出)。 */
141
+ readonly clear: () => Promise<void>;
142
+ /** 订阅 Token 刷新成功事件,返回取消订阅函数。 */
143
+ readonly onTokenRefreshed: (callback: (tokens: TokenPair) => void) => () => void;
144
+ }
145
+ /** API client 生命周期能力。 */
146
+ interface ApiClientLifecycle {
249
147
  /**
250
- * 流式请求(返回 AsyncIterable)
148
+ * 初始化 client;必须在调用任何 procedure 前完成。
251
149
  *
252
- * @throws 未初始化时抛出异常(async generator 无法返回 HaiResult)
150
+ * @example
151
+ * ```ts
152
+ * await client.init({
153
+ * baseUrl: 'https://api.example.com/api/v1',
154
+ * auth: { refreshPath: '/auth/refresh' },
155
+ * timeout: 15_000,
156
+ * })
157
+ * ```
253
158
  */
254
- readonly stream: ApiClient['stream'];
255
- /** 契约调用(推荐) */
256
- readonly call: ApiClient['call'];
257
- /** Token 管理 */
258
- readonly auth: ApiClient['auth'];
159
+ readonly init: (config: ApiClientConfig) => Promise<HaiResult<void>>;
160
+ /** 释放资源并允许重新 `init`。 */
161
+ readonly close: () => Promise<void>;
162
+ /** 当前运行配置;未初始化时为 `null`。 */
163
+ readonly config: ApiClientConfig | null;
164
+ /** 是否已完成初始化。 */
165
+ readonly isInitialized: boolean;
166
+ /** Token 辅助操作。 */
167
+ readonly auth: ApiClientAuth;
259
168
  }
169
+ /** 根据 oRPC contract 推导出的 typed API client(生命周期 + procedure 调用)。 */
170
+ type ApiClient<TContract extends AnyContractRouter> = ApiClientLifecycle & JsonifiedClient<ContractRouterClient<TContract>>;
260
171
 
261
172
  /**
262
- * @h-ai/api-client — Token 存储适配器
173
+ * @h-ai/api-client — Token 存储与刷新管理
174
+ *
175
+ * 提供两个内置 Token 存储适配器(localStorage / 内存)和一个 Token 管理器
176
+ * (封装存储读写、自动刷新、并发去重、回调通知)。
177
+ *
178
+ * @example 浏览器 SPA
179
+ * ```ts
180
+ * import { apiClient } from '@h-ai/api-client'
181
+ *
182
+ * await apiClient.init({
183
+ * baseUrl: 'https://api.example.com/api/v1',
184
+ * auth: { storage: apiClient.tokenStorage.localStorage() },
185
+ * })
186
+ * ```
187
+ *
188
+ * @example Node.js 测试
189
+ * ```ts
190
+ * import { apiClient } from '@h-ai/api-client'
191
+ *
192
+ * const storage = apiClient.tokenStorage.memory()
193
+ * await storage.setAccessToken('abc')
194
+ * ```
263
195
  *
264
- * 提供 localStorage 和内存两种内置 Token 存储实现。
265
196
  * @module api-client-auth
266
197
  */
267
198
 
268
199
  /**
269
- * 创建基于 localStorage 的 Token 存储
270
- *
271
- * 适用于浏览器端 SPA / PWA。Capacitor 环境建议使用
272
- * `@h-ai/capacitor` 提供的 `CapacitorTokenStorage`。
200
+ * 创建基于 `localStorage` 的 Token 存储(浏览器 SPA / PWA)。
273
201
  *
274
- * @returns TokenStorage 实例
202
+ * ⚠️ 安全提示(XSS 风险):
203
+ * - `localStorage` 对同源脚本可读,任意 XSS 漏洞都可以偷取 Token。
204
+ * - 生产环境应优先使用 httpOnly cookie + SameSite 或 BFF 主机代理。
205
+ * - 本适配器仅适用于内部工具、Demo、或者已接受 XSS 风险的浏览器场景,
206
+ * 并且在调用方明确选择使用。`apiClient.create` 默认不会使用本适配器,
207
+ * 需调用方显式传入 `auth.storage = apiClient.tokenStorage.localStorage()`。
275
208
  *
276
209
  * @example
277
210
  * ```ts
278
- * import { api, createLocalStorageTokenStorage } from '@h-ai/api-client'
279
- *
280
- * await api.init({
281
- * baseUrl: 'https://api.example.com',
282
- * auth: {
283
- * storage: createLocalStorageTokenStorage(),
284
- * refreshUrl: '/auth/refresh',
285
- * },
211
+ * await apiClient.init({
212
+ * baseUrl: 'https://api.example.com/api/v1',
213
+ * auth: { storage: apiClient.tokenStorage.localStorage() },
286
214
  * })
287
215
  * ```
288
216
  */
289
217
  declare function createLocalStorageTokenStorage(): TokenStorage;
290
218
  /**
291
- * 创建内存 Token 存储
219
+ * 创建内存 Token 存储(Node.js 测试 / SSR / 短生命周期场景)。
220
+ * 页面刷新后丢失。
292
221
  *
293
- * 适用于 Node.js 测试、SSR 或短生命周期场景。
294
- * 页面刷新后 Token 丢失。
222
+ * @example
223
+ * ```ts
224
+ * const storage = apiClient.tokenStorage.memory()
225
+ * await storage.setAccessToken('abc')
226
+ * ```
227
+ */
228
+ declare function createMemoryTokenStorage(): TokenStorage;
229
+ /**
230
+ * 创建基于 httpOnly cookie 的 Token 存储(生产环境推荐方案)。
295
231
  *
296
- * @returns TokenStorage 实例
232
+ * **安全模型:**
233
+ * - `accessToken` 保存在**内存**中:JS 可读写,用于注入 `Authorization: Bearer`;
234
+ * 页面刷新后丢失,由 refresh 流程自动补充。
235
+ * - `refreshToken` 保存在服务端设置的 **httpOnly cookie** 中:
236
+ * - JS 不可读写,XSS 脚本无法直接盗取。
237
+ * - 结合 `SameSite=Strict` 可阻止 CSRF 攻击。
238
+ * - 浏览器在每次请求时自动携带,无需客户端显式传递。
239
+ *
240
+ * **服务端配套要求:**
241
+ * 1. 登录端点在响应中设置:
242
+ * ```
243
+ * Set-Cookie: refresh_token=<token>; HttpOnly; SameSite=Strict; Secure;
244
+ * Path=/api/v1/auth/refresh; Max-Age=<seconds>
245
+ * ```
246
+ * `Path` 限定为 refresh 端点,减少 Cookie 暴露面。
247
+ * 2. Refresh 端点从 Cookie 读取 refresh token(忽略请求体中的 `refreshToken` 字段)。
248
+ * 3. Logout 端点清除 Cookie:
249
+ * ```
250
+ * Set-Cookie: refresh_token=; HttpOnly; SameSite=Strict; Secure;
251
+ * Path=/api/v1/auth/refresh; Max-Age=0
252
+ * ```
253
+ *
254
+ * **跨域注意事项:**
255
+ * 若 API 与前端不同源,服务端还需设置:
256
+ * `Access-Control-Allow-Origin: <前端域名>` 和 `Access-Control-Allow-Credentials: true`。
257
+ * 调用方不需要做额外配置,`apiClient.create` 会自动识别并设置 `credentials: 'include'`。
297
258
  *
298
259
  * @example
299
260
  * ```ts
300
- * import { api, createMemoryTokenStorage } from '@h-ai/api-client'
301
- *
302
- * await api.init({
303
- * baseUrl: 'https://api.example.com',
304
- * auth: {
305
- * storage: createMemoryTokenStorage(),
306
- * refreshUrl: '/auth/refresh',
307
- * },
261
+ * await apiClient.init({
262
+ * baseUrl: 'https://api.example.com/api/v1',
263
+ * auth: { storage: apiClient.tokenStorage.httpOnlyCookie() },
308
264
  * })
309
265
  * ```
310
266
  */
311
- declare function createMemoryTokenStorage(): TokenStorage;
312
-
267
+ declare function createHttpOnlyCookieTokenStorage(): TokenStorage;
268
+ type RefreshCallback = (tokens: TokenPair) => void;
313
269
  /**
314
- * @h-ai/api-client — 模块入口
270
+ * 创建 Token 管理器:封装存储读写、自动刷新、并发去重与回调通知。
271
+ *
272
+ * 主要供 `apiClient.create` 内部使用,同时作为 named export 暴露给测试与高级用户。
273
+ *
274
+ * 行为约定:
275
+ * - 并发多次 `refresh()` 共享同一个请求。
276
+ * - refresh 接口失败、响应字段缺失或 401,都视为刷新失败:清空存储并触发 `onRefreshFailed`。
277
+ * - 兼容两种响应格式:`{ data: tokens }` 与 `{ data: { tokens } }`(HaiResult 包装)。
278
+ *
279
+ * @example
280
+ * ```ts
281
+ * const manager = createTokenManager(
282
+ * apiClient.tokenStorage.memory(),
283
+ * 'https://api.example.com/api/v1/auth/refresh',
284
+ * fetch,
285
+ * () => notifyLoginRequired(),
286
+ * )
315
287
  *
316
- * 提供统一的 `api` 对象,管理 HTTP 客户端运行时状态与生命周期。
317
- * @module api-client-main
288
+ * const off = manager.onTokenRefreshed(tokens => syncTokens(tokens))
289
+ * const tokens = await manager.refresh()
290
+ * off()
291
+ * ```
292
+ *
293
+ * @param storage - Token 存储适配器
294
+ * @param refreshEndpointUrl - refresh 接口完整 URL(`baseUrl + refreshPath`)
295
+ * @param fetchFn - fetch 实现(允许注入 mock)
296
+ * @param onRefreshFailed - 刷新失败回调
297
+ * @param refreshTimeoutMs - 刷新请求超时(ms),默认 10_000
298
+ * @returns Token 管理器实例
318
299
  */
300
+ declare function createTokenManager(storage: TokenStorage, refreshEndpointUrl: string, fetchFn: typeof globalThis.fetch, onRefreshFailed?: () => void, refreshTimeoutMs?: number): {
301
+ storage: TokenStorage;
302
+ refresh: () => Promise<TokenPair | null>;
303
+ setTokens(tokens: TokenPair): Promise<void>;
304
+ clear(): Promise<void>;
305
+ onTokenRefreshed(callback: RefreshCallback): () => void;
306
+ };
307
+ /** Token 管理器类型(`createTokenManager` 返回值)。 */
308
+ type TokenManager = ReturnType<typeof createTokenManager>;
319
309
 
310
+ /** Token 存储方案集合:内存 / 浏览器 localStorage / httpOnly Cookie。 */
311
+ declare const tokenStorage: {
312
+ /** 内存存储——SSR / Node 测试或一次性会话使用。 */
313
+ readonly memory: typeof createMemoryTokenStorage;
314
+ /** 浏览器 `localStorage` 存储——单页应用便捷选项;注意 XSS 风险。 */
315
+ readonly localStorage: typeof createLocalStorageTokenStorage;
316
+ /** httpOnly Cookie 存储——浏览器场景推荐方案。 */
317
+ readonly httpOnlyCookie: typeof createHttpOnlyCookieTokenStorage;
318
+ };
320
319
  /**
321
- * API 客户端单例
320
+ * 根据 oRPC contract 创建 typed API client。
322
321
  *
323
- * 使用前必须先调用 `api.init()` 初始化,传入 baseUrl 等配置信息。
324
- * 初始化后通过 `api.get`、`api.post`、`api.call` 等方法发起请求。
322
+ * 返回对象同时具备:
323
+ * - **生命周期能力**:`init` / `close` / `config` / `isInitialized` / `auth`
324
+ * - **contract procedure**:按 contract 嵌套结构调用,例如 `client.iam.auth.login(input)`
325
325
  *
326
- * @example
326
+ * @example 基础用法
327
327
  * ```ts
328
- * import { api } from '@h-ai/api-client'
328
+ * import { apiClient } from '@h-ai/api-client'
329
+ * import { apiContract } from '@h-ai/api-contract'
330
+ *
331
+ * const client = apiClient.create(apiContract.create({ iam: apiContract.iam }))
332
+ * await client.init({ baseUrl: 'https://api.example.com/api/v1' })
329
333
  *
330
- * // 初始化
331
- * await api.init({
334
+ * const result = await client.iam.auth.login({ identifier: 'alice', password: 'secret' })
335
+ * if (result.success) {
336
+ * await client.auth.setTokens(result.data.tokens)
337
+ * }
338
+ *
339
+ * await client.close()
340
+ * ```
341
+ *
342
+ * @example 自定义 fetch / 超时
343
+ * ```ts
344
+ * const client = apiClient.create(contract)
345
+ * await client.init({
332
346
  * baseUrl: 'https://api.example.com/api/v1',
333
- * auth: { refreshUrl: '/auth/refresh' },
347
+ * fetch: customFetch,
348
+ * timeout: 10_000,
334
349
  * })
350
+ * ```
351
+ */
352
+ declare function createApiClient<const TContract extends AnyContractRouter>(contract: TContract): ApiClient<TContract>;
353
+ /**
354
+ * 默认 API typed client:绑定 `iam` / `storage` / `ai` 三个领域。
335
355
  *
336
- * // 契约调用
337
- * const result = await api.call(loginEndpoint, { identifier: 'alice', password: 'xxx' })
356
+ * 大多数应用只需 `import { apiClient }` 并调用 `apiClient.init()` 即可。
338
357
  *
339
- * // 通用 HTTP
340
- * const users = await api.get<User[]>('/users', { page: 1 })
358
+ * @example
359
+ * ```ts
360
+ * import { apiClient } from '@h-ai/api-client'
341
361
  *
342
- * // 关闭
343
- * await api.close()
362
+ * await apiClient.init({
363
+ * baseUrl: 'http://localhost:3000/api/v1',
364
+ * auth: { refreshPath: '/auth/refresh' },
365
+ * })
366
+ * const result = await apiClient.iam.auth.login({ identifier: 'alice', password: 'secret' })
367
+ * await apiClient.close()
344
368
  * ```
345
369
  */
346
- declare const api: ApiClientFunctions;
370
+ declare const defaultApiContract: _h_ai_api_contract.CreatedApiContract<{
371
+ readonly iam: {
372
+ auth: {
373
+ login: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
374
+ identifier: zod.ZodString;
375
+ password: zod.ZodString;
376
+ rememberMe: zod.ZodOptional<zod.ZodBoolean>;
377
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
378
+ success: zod.ZodLiteral<true>;
379
+ data: zod.ZodObject<{
380
+ user: zod.ZodObject<{
381
+ id: zod.ZodString;
382
+ username: zod.ZodString;
383
+ email: zod.ZodOptional<zod.ZodString>;
384
+ phone: zod.ZodOptional<zod.ZodString>;
385
+ displayName: zod.ZodOptional<zod.ZodString>;
386
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
387
+ enabled: zod.ZodBoolean;
388
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
389
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
390
+ createdAt: zod.ZodCoercedDate<unknown>;
391
+ updatedAt: zod.ZodCoercedDate<unknown>;
392
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
393
+ }, zod_v4_core.$strip>;
394
+ tokens: zod.ZodObject<{
395
+ accessToken: zod.ZodString;
396
+ refreshToken: zod.ZodOptional<zod.ZodString>;
397
+ expiresIn: zod.ZodNumber;
398
+ tokenType: zod.ZodLiteral<"Bearer">;
399
+ }, zod_v4_core.$strip>;
400
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
401
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
402
+ agreements: zod.ZodOptional<zod.ZodObject<{
403
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
404
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
405
+ showOnRegister: zod.ZodBoolean;
406
+ showOnLogin: zod.ZodBoolean;
407
+ }, zod_v4_core.$strip>>;
408
+ }, zod_v4_core.$strip>;
409
+ }, zod_v4_core.$strip>, zod.ZodObject<{
410
+ success: zod.ZodLiteral<false>;
411
+ error: zod.ZodObject<{
412
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
413
+ message: zod.ZodString;
414
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
415
+ system: zod.ZodOptional<zod.ZodString>;
416
+ module: zod.ZodOptional<zod.ZodString>;
417
+ cause: zod.ZodOptional<zod.ZodUnknown>;
418
+ suggestion: zod.ZodOptional<zod.ZodString>;
419
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
420
+ }, zod_v4_core.$strip>;
421
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
422
+ loginWithOtp: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
423
+ identifier: zod.ZodString;
424
+ code: zod.ZodString;
425
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
426
+ success: zod.ZodLiteral<true>;
427
+ data: zod.ZodObject<{
428
+ user: zod.ZodObject<{
429
+ id: zod.ZodString;
430
+ username: zod.ZodString;
431
+ email: zod.ZodOptional<zod.ZodString>;
432
+ phone: zod.ZodOptional<zod.ZodString>;
433
+ displayName: zod.ZodOptional<zod.ZodString>;
434
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
435
+ enabled: zod.ZodBoolean;
436
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
437
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
438
+ createdAt: zod.ZodCoercedDate<unknown>;
439
+ updatedAt: zod.ZodCoercedDate<unknown>;
440
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
441
+ }, zod_v4_core.$strip>;
442
+ tokens: zod.ZodObject<{
443
+ accessToken: zod.ZodString;
444
+ refreshToken: zod.ZodOptional<zod.ZodString>;
445
+ expiresIn: zod.ZodNumber;
446
+ tokenType: zod.ZodLiteral<"Bearer">;
447
+ }, zod_v4_core.$strip>;
448
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
449
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
450
+ agreements: zod.ZodOptional<zod.ZodObject<{
451
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
452
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
453
+ showOnRegister: zod.ZodBoolean;
454
+ showOnLogin: zod.ZodBoolean;
455
+ }, zod_v4_core.$strip>>;
456
+ }, zod_v4_core.$strip>;
457
+ }, zod_v4_core.$strip>, zod.ZodObject<{
458
+ success: zod.ZodLiteral<false>;
459
+ error: zod.ZodObject<{
460
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
461
+ message: zod.ZodString;
462
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
463
+ system: zod.ZodOptional<zod.ZodString>;
464
+ module: zod.ZodOptional<zod.ZodString>;
465
+ cause: zod.ZodOptional<zod.ZodUnknown>;
466
+ suggestion: zod.ZodOptional<zod.ZodString>;
467
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
468
+ }, zod_v4_core.$strip>;
469
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
470
+ logout: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
471
+ accessToken: zod.ZodOptional<zod.ZodString>;
472
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
473
+ success: zod.ZodLiteral<true>;
474
+ data: zod.ZodVoid;
475
+ }, zod_v4_core.$strip>, zod.ZodObject<{
476
+ success: zod.ZodLiteral<false>;
477
+ error: zod.ZodObject<{
478
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
479
+ message: zod.ZodString;
480
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
481
+ system: zod.ZodOptional<zod.ZodString>;
482
+ module: zod.ZodOptional<zod.ZodString>;
483
+ cause: zod.ZodOptional<zod.ZodUnknown>;
484
+ suggestion: zod.ZodOptional<zod.ZodString>;
485
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
486
+ }, zod_v4_core.$strip>;
487
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
488
+ currentUser: _orpc_contract.ContractProcedureBuilderWithOutput<_orpc_contract.Schema<unknown, unknown>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
489
+ success: zod.ZodLiteral<true>;
490
+ data: zod.ZodObject<{
491
+ id: zod.ZodString;
492
+ username: zod.ZodString;
493
+ email: zod.ZodOptional<zod.ZodString>;
494
+ phone: zod.ZodOptional<zod.ZodString>;
495
+ displayName: zod.ZodOptional<zod.ZodString>;
496
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
497
+ enabled: zod.ZodBoolean;
498
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
499
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
500
+ createdAt: zod.ZodCoercedDate<unknown>;
501
+ updatedAt: zod.ZodCoercedDate<unknown>;
502
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
503
+ }, zod_v4_core.$strip>;
504
+ }, zod_v4_core.$strip>, zod.ZodObject<{
505
+ success: zod.ZodLiteral<false>;
506
+ error: zod.ZodObject<{
507
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
508
+ message: zod.ZodString;
509
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
510
+ system: zod.ZodOptional<zod.ZodString>;
511
+ module: zod.ZodOptional<zod.ZodString>;
512
+ cause: zod.ZodOptional<zod.ZodUnknown>;
513
+ suggestion: zod.ZodOptional<zod.ZodString>;
514
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
515
+ }, zod_v4_core.$strip>;
516
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
517
+ refresh: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
518
+ refreshToken: zod.ZodString;
519
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
520
+ success: zod.ZodLiteral<true>;
521
+ data: zod.ZodObject<{
522
+ tokens: zod.ZodObject<{
523
+ accessToken: zod.ZodString;
524
+ refreshToken: zod.ZodOptional<zod.ZodString>;
525
+ expiresIn: zod.ZodNumber;
526
+ tokenType: zod.ZodLiteral<"Bearer">;
527
+ }, zod_v4_core.$strip>;
528
+ }, zod_v4_core.$strip>;
529
+ }, zod_v4_core.$strip>, zod.ZodObject<{
530
+ success: zod.ZodLiteral<false>;
531
+ error: zod.ZodObject<{
532
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
533
+ message: zod.ZodString;
534
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
535
+ system: zod.ZodOptional<zod.ZodString>;
536
+ module: zod.ZodOptional<zod.ZodString>;
537
+ cause: zod.ZodOptional<zod.ZodUnknown>;
538
+ suggestion: zod.ZodOptional<zod.ZodString>;
539
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
540
+ }, zod_v4_core.$strip>;
541
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
542
+ sendOtp: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
543
+ identifier: zod.ZodString;
544
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
545
+ success: zod.ZodLiteral<true>;
546
+ data: zod.ZodObject<{
547
+ expiresAt: zod.ZodCoercedDate<unknown>;
548
+ }, zod_v4_core.$strip>;
549
+ }, zod_v4_core.$strip>, zod.ZodObject<{
550
+ success: zod.ZodLiteral<false>;
551
+ error: zod.ZodObject<{
552
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
553
+ message: zod.ZodString;
554
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
555
+ system: zod.ZodOptional<zod.ZodString>;
556
+ module: zod.ZodOptional<zod.ZodString>;
557
+ cause: zod.ZodOptional<zod.ZodUnknown>;
558
+ suggestion: zod.ZodOptional<zod.ZodString>;
559
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
560
+ }, zod_v4_core.$strip>;
561
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
562
+ register: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
563
+ username: zod.ZodString;
564
+ password: zod.ZodString;
565
+ email: zod.ZodOptional<zod.ZodString>;
566
+ phone: zod.ZodOptional<zod.ZodString>;
567
+ displayName: zod.ZodOptional<zod.ZodString>;
568
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
569
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
570
+ success: zod.ZodLiteral<true>;
571
+ data: zod.ZodObject<{
572
+ user: zod.ZodObject<{
573
+ id: zod.ZodString;
574
+ username: zod.ZodString;
575
+ email: zod.ZodOptional<zod.ZodString>;
576
+ phone: zod.ZodOptional<zod.ZodString>;
577
+ displayName: zod.ZodOptional<zod.ZodString>;
578
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
579
+ enabled: zod.ZodBoolean;
580
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
581
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
582
+ createdAt: zod.ZodCoercedDate<unknown>;
583
+ updatedAt: zod.ZodCoercedDate<unknown>;
584
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
585
+ }, zod_v4_core.$strip>;
586
+ tokens: zod.ZodObject<{
587
+ accessToken: zod.ZodString;
588
+ refreshToken: zod.ZodOptional<zod.ZodString>;
589
+ expiresIn: zod.ZodNumber;
590
+ tokenType: zod.ZodLiteral<"Bearer">;
591
+ }, zod_v4_core.$strip>;
592
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
593
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
594
+ agreements: zod.ZodOptional<zod.ZodObject<{
595
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
596
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
597
+ showOnRegister: zod.ZodBoolean;
598
+ showOnLogin: zod.ZodBoolean;
599
+ }, zod_v4_core.$strip>>;
600
+ }, zod_v4_core.$strip>;
601
+ }, zod_v4_core.$strip>, zod.ZodObject<{
602
+ success: zod.ZodLiteral<false>;
603
+ error: zod.ZodObject<{
604
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
605
+ message: zod.ZodString;
606
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
607
+ system: zod.ZodOptional<zod.ZodString>;
608
+ module: zod.ZodOptional<zod.ZodString>;
609
+ cause: zod.ZodOptional<zod.ZodUnknown>;
610
+ suggestion: zod.ZodOptional<zod.ZodString>;
611
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
612
+ }, zod_v4_core.$strip>;
613
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
614
+ changePassword: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
615
+ oldPassword: zod.ZodString;
616
+ newPassword: zod.ZodString;
617
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
618
+ success: zod.ZodLiteral<true>;
619
+ data: zod.ZodVoid;
620
+ }, zod_v4_core.$strip>, zod.ZodObject<{
621
+ success: zod.ZodLiteral<false>;
622
+ error: zod.ZodObject<{
623
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
624
+ message: zod.ZodString;
625
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
626
+ system: zod.ZodOptional<zod.ZodString>;
627
+ module: zod.ZodOptional<zod.ZodString>;
628
+ cause: zod.ZodOptional<zod.ZodUnknown>;
629
+ suggestion: zod.ZodOptional<zod.ZodString>;
630
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
631
+ }, zod_v4_core.$strip>;
632
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
633
+ updateCurrentUser: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
634
+ username: zod.ZodOptional<zod.ZodString>;
635
+ email: zod.ZodOptional<zod.ZodString>;
636
+ displayName: zod.ZodOptional<zod.ZodString>;
637
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
638
+ phone: zod.ZodOptional<zod.ZodString>;
639
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
640
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
641
+ success: zod.ZodLiteral<true>;
642
+ data: zod.ZodObject<{
643
+ id: zod.ZodString;
644
+ username: zod.ZodString;
645
+ email: zod.ZodOptional<zod.ZodString>;
646
+ phone: zod.ZodOptional<zod.ZodString>;
647
+ displayName: zod.ZodOptional<zod.ZodString>;
648
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
649
+ enabled: zod.ZodBoolean;
650
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
651
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
652
+ createdAt: zod.ZodCoercedDate<unknown>;
653
+ updatedAt: zod.ZodCoercedDate<unknown>;
654
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
655
+ }, zod_v4_core.$strip>;
656
+ }, zod_v4_core.$strip>, zod.ZodObject<{
657
+ success: zod.ZodLiteral<false>;
658
+ error: zod.ZodObject<{
659
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
660
+ message: zod.ZodString;
661
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
662
+ system: zod.ZodOptional<zod.ZodString>;
663
+ module: zod.ZodOptional<zod.ZodString>;
664
+ cause: zod.ZodOptional<zod.ZodUnknown>;
665
+ suggestion: zod.ZodOptional<zod.ZodString>;
666
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
667
+ }, zod_v4_core.$strip>;
668
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
669
+ };
670
+ users: {
671
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
672
+ page: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
673
+ pageSize: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
674
+ search: zod.ZodOptional<zod.ZodString>;
675
+ enabled: zod.ZodPipe<zod.ZodOptional<zod.ZodEnum<{
676
+ true: "true";
677
+ false: "false";
678
+ }>>, zod.ZodTransform<boolean | undefined, "true" | "false" | undefined>>;
679
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
680
+ success: zod.ZodLiteral<true>;
681
+ data: zod.ZodObject<{
682
+ items: zod.ZodArray<zod.ZodObject<{
683
+ id: zod.ZodString;
684
+ username: zod.ZodString;
685
+ email: zod.ZodOptional<zod.ZodString>;
686
+ phone: zod.ZodOptional<zod.ZodString>;
687
+ displayName: zod.ZodOptional<zod.ZodString>;
688
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
689
+ enabled: zod.ZodBoolean;
690
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
691
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
692
+ createdAt: zod.ZodCoercedDate<unknown>;
693
+ updatedAt: zod.ZodCoercedDate<unknown>;
694
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
695
+ }, zod_v4_core.$strip>>;
696
+ total: zod.ZodNumber;
697
+ page: zod.ZodNumber;
698
+ pageSize: zod.ZodNumber;
699
+ }, zod_v4_core.$strip>;
700
+ }, zod_v4_core.$strip>, zod.ZodObject<{
701
+ success: zod.ZodLiteral<false>;
702
+ error: zod.ZodObject<{
703
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
704
+ message: zod.ZodString;
705
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
706
+ system: zod.ZodOptional<zod.ZodString>;
707
+ module: zod.ZodOptional<zod.ZodString>;
708
+ cause: zod.ZodOptional<zod.ZodUnknown>;
709
+ suggestion: zod.ZodOptional<zod.ZodString>;
710
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
711
+ }, zod_v4_core.$strip>;
712
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
713
+ get: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
714
+ id: zod.ZodString;
715
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
716
+ success: zod.ZodLiteral<true>;
717
+ data: zod.ZodNullable<zod.ZodObject<{
718
+ id: zod.ZodString;
719
+ username: zod.ZodString;
720
+ email: zod.ZodOptional<zod.ZodString>;
721
+ phone: zod.ZodOptional<zod.ZodString>;
722
+ displayName: zod.ZodOptional<zod.ZodString>;
723
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
724
+ enabled: zod.ZodBoolean;
725
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
726
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
727
+ createdAt: zod.ZodCoercedDate<unknown>;
728
+ updatedAt: zod.ZodCoercedDate<unknown>;
729
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
730
+ }, zod_v4_core.$strip>>;
731
+ }, zod_v4_core.$strip>, zod.ZodObject<{
732
+ success: zod.ZodLiteral<false>;
733
+ error: zod.ZodObject<{
734
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
735
+ message: zod.ZodString;
736
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
737
+ system: zod.ZodOptional<zod.ZodString>;
738
+ module: zod.ZodOptional<zod.ZodString>;
739
+ cause: zod.ZodOptional<zod.ZodUnknown>;
740
+ suggestion: zod.ZodOptional<zod.ZodString>;
741
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
742
+ }, zod_v4_core.$strip>;
743
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
744
+ create: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
745
+ username: zod.ZodString;
746
+ email: zod.ZodOptional<zod.ZodString>;
747
+ phone: zod.ZodOptional<zod.ZodString>;
748
+ password: zod.ZodString;
749
+ displayName: zod.ZodOptional<zod.ZodString>;
750
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
751
+ roleIds: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
752
+ enabled: zod.ZodOptional<zod.ZodBoolean>;
753
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
754
+ success: zod.ZodLiteral<true>;
755
+ data: zod.ZodObject<{
756
+ id: zod.ZodString;
757
+ username: zod.ZodString;
758
+ email: zod.ZodOptional<zod.ZodString>;
759
+ phone: zod.ZodOptional<zod.ZodString>;
760
+ displayName: zod.ZodOptional<zod.ZodString>;
761
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
762
+ enabled: zod.ZodBoolean;
763
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
764
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
765
+ createdAt: zod.ZodCoercedDate<unknown>;
766
+ updatedAt: zod.ZodCoercedDate<unknown>;
767
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
768
+ }, zod_v4_core.$strip>;
769
+ }, zod_v4_core.$strip>, zod.ZodObject<{
770
+ success: zod.ZodLiteral<false>;
771
+ error: zod.ZodObject<{
772
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
773
+ message: zod.ZodString;
774
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
775
+ system: zod.ZodOptional<zod.ZodString>;
776
+ module: zod.ZodOptional<zod.ZodString>;
777
+ cause: zod.ZodOptional<zod.ZodUnknown>;
778
+ suggestion: zod.ZodOptional<zod.ZodString>;
779
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
780
+ }, zod_v4_core.$strip>;
781
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
782
+ update: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
783
+ id: zod.ZodString;
784
+ username: zod.ZodOptional<zod.ZodString>;
785
+ email: zod.ZodOptional<zod.ZodString>;
786
+ phone: zod.ZodOptional<zod.ZodString>;
787
+ displayName: zod.ZodOptional<zod.ZodString>;
788
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
789
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
790
+ enabled: zod.ZodOptional<zod.ZodBoolean>;
791
+ roleIds: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
792
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
793
+ success: zod.ZodLiteral<true>;
794
+ data: zod.ZodObject<{
795
+ id: zod.ZodString;
796
+ username: zod.ZodString;
797
+ email: zod.ZodOptional<zod.ZodString>;
798
+ phone: zod.ZodOptional<zod.ZodString>;
799
+ displayName: zod.ZodOptional<zod.ZodString>;
800
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
801
+ enabled: zod.ZodBoolean;
802
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
803
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
804
+ createdAt: zod.ZodCoercedDate<unknown>;
805
+ updatedAt: zod.ZodCoercedDate<unknown>;
806
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
807
+ }, zod_v4_core.$strip>;
808
+ }, zod_v4_core.$strip>, zod.ZodObject<{
809
+ success: zod.ZodLiteral<false>;
810
+ error: zod.ZodObject<{
811
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
812
+ message: zod.ZodString;
813
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
814
+ system: zod.ZodOptional<zod.ZodString>;
815
+ module: zod.ZodOptional<zod.ZodString>;
816
+ cause: zod.ZodOptional<zod.ZodUnknown>;
817
+ suggestion: zod.ZodOptional<zod.ZodString>;
818
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
819
+ }, zod_v4_core.$strip>;
820
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
821
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
822
+ id: zod.ZodString;
823
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
824
+ success: zod.ZodLiteral<true>;
825
+ data: zod.ZodVoid;
826
+ }, zod_v4_core.$strip>, zod.ZodObject<{
827
+ success: zod.ZodLiteral<false>;
828
+ error: zod.ZodObject<{
829
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
830
+ message: zod.ZodString;
831
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
832
+ system: zod.ZodOptional<zod.ZodString>;
833
+ module: zod.ZodOptional<zod.ZodString>;
834
+ cause: zod.ZodOptional<zod.ZodUnknown>;
835
+ suggestion: zod.ZodOptional<zod.ZodString>;
836
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
837
+ }, zod_v4_core.$strip>;
838
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
839
+ resetPassword: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
840
+ id: zod.ZodString;
841
+ newPassword: zod.ZodString;
842
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
843
+ success: zod.ZodLiteral<true>;
844
+ data: zod.ZodVoid;
845
+ }, zod_v4_core.$strip>, zod.ZodObject<{
846
+ success: zod.ZodLiteral<false>;
847
+ error: zod.ZodObject<{
848
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
849
+ message: zod.ZodString;
850
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
851
+ system: zod.ZodOptional<zod.ZodString>;
852
+ module: zod.ZodOptional<zod.ZodString>;
853
+ cause: zod.ZodOptional<zod.ZodUnknown>;
854
+ suggestion: zod.ZodOptional<zod.ZodString>;
855
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
856
+ }, zod_v4_core.$strip>;
857
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
858
+ };
859
+ roles: {
860
+ list: _orpc_contract.ContractProcedureBuilderWithOutput<_orpc_contract.Schema<unknown, unknown>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
861
+ success: zod.ZodLiteral<true>;
862
+ data: zod.ZodObject<{
863
+ items: zod.ZodArray<zod.ZodObject<{
864
+ id: zod.ZodString;
865
+ code: zod.ZodString;
866
+ name: zod.ZodString;
867
+ description: zod.ZodOptional<zod.ZodString>;
868
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
869
+ createdAt: zod.ZodCoercedDate<unknown>;
870
+ updatedAt: zod.ZodCoercedDate<unknown>;
871
+ }, zod_v4_core.$strip>>;
872
+ total: zod.ZodNumber;
873
+ page: zod.ZodNumber;
874
+ pageSize: zod.ZodNumber;
875
+ }, zod_v4_core.$strip>;
876
+ }, zod_v4_core.$strip>, zod.ZodObject<{
877
+ success: zod.ZodLiteral<false>;
878
+ error: zod.ZodObject<{
879
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
880
+ message: zod.ZodString;
881
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
882
+ system: zod.ZodOptional<zod.ZodString>;
883
+ module: zod.ZodOptional<zod.ZodString>;
884
+ cause: zod.ZodOptional<zod.ZodUnknown>;
885
+ suggestion: zod.ZodOptional<zod.ZodString>;
886
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
887
+ }, zod_v4_core.$strip>;
888
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
889
+ get: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
890
+ id: zod.ZodString;
891
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
892
+ success: zod.ZodLiteral<true>;
893
+ data: zod.ZodNullable<zod.ZodObject<{
894
+ id: zod.ZodString;
895
+ code: zod.ZodString;
896
+ name: zod.ZodString;
897
+ description: zod.ZodOptional<zod.ZodString>;
898
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
899
+ createdAt: zod.ZodCoercedDate<unknown>;
900
+ updatedAt: zod.ZodCoercedDate<unknown>;
901
+ }, zod_v4_core.$strip>>;
902
+ }, zod_v4_core.$strip>, zod.ZodObject<{
903
+ success: zod.ZodLiteral<false>;
904
+ error: zod.ZodObject<{
905
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
906
+ message: zod.ZodString;
907
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
908
+ system: zod.ZodOptional<zod.ZodString>;
909
+ module: zod.ZodOptional<zod.ZodString>;
910
+ cause: zod.ZodOptional<zod.ZodUnknown>;
911
+ suggestion: zod.ZodOptional<zod.ZodString>;
912
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
913
+ }, zod_v4_core.$strip>;
914
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
915
+ create: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
916
+ code: zod.ZodString;
917
+ name: zod.ZodString;
918
+ description: zod.ZodOptional<zod.ZodString>;
919
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
920
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
921
+ success: zod.ZodLiteral<true>;
922
+ data: zod.ZodObject<{
923
+ id: zod.ZodString;
924
+ code: zod.ZodString;
925
+ name: zod.ZodString;
926
+ description: zod.ZodOptional<zod.ZodString>;
927
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
928
+ createdAt: zod.ZodCoercedDate<unknown>;
929
+ updatedAt: zod.ZodCoercedDate<unknown>;
930
+ }, zod_v4_core.$strip>;
931
+ }, zod_v4_core.$strip>, zod.ZodObject<{
932
+ success: zod.ZodLiteral<false>;
933
+ error: zod.ZodObject<{
934
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
935
+ message: zod.ZodString;
936
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
937
+ system: zod.ZodOptional<zod.ZodString>;
938
+ module: zod.ZodOptional<zod.ZodString>;
939
+ cause: zod.ZodOptional<zod.ZodUnknown>;
940
+ suggestion: zod.ZodOptional<zod.ZodString>;
941
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
942
+ }, zod_v4_core.$strip>;
943
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
944
+ update: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
945
+ id: zod.ZodString;
946
+ name: zod.ZodOptional<zod.ZodString>;
947
+ description: zod.ZodOptional<zod.ZodString>;
948
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
949
+ success: zod.ZodLiteral<true>;
950
+ data: zod.ZodObject<{
951
+ id: zod.ZodString;
952
+ code: zod.ZodString;
953
+ name: zod.ZodString;
954
+ description: zod.ZodOptional<zod.ZodString>;
955
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
956
+ createdAt: zod.ZodCoercedDate<unknown>;
957
+ updatedAt: zod.ZodCoercedDate<unknown>;
958
+ }, zod_v4_core.$strip>;
959
+ }, zod_v4_core.$strip>, zod.ZodObject<{
960
+ success: zod.ZodLiteral<false>;
961
+ error: zod.ZodObject<{
962
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
963
+ message: zod.ZodString;
964
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
965
+ system: zod.ZodOptional<zod.ZodString>;
966
+ module: zod.ZodOptional<zod.ZodString>;
967
+ cause: zod.ZodOptional<zod.ZodUnknown>;
968
+ suggestion: zod.ZodOptional<zod.ZodString>;
969
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
970
+ }, zod_v4_core.$strip>;
971
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
972
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
973
+ id: zod.ZodString;
974
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
975
+ success: zod.ZodLiteral<true>;
976
+ data: zod.ZodVoid;
977
+ }, zod_v4_core.$strip>, zod.ZodObject<{
978
+ success: zod.ZodLiteral<false>;
979
+ error: zod.ZodObject<{
980
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
981
+ message: zod.ZodString;
982
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
983
+ system: zod.ZodOptional<zod.ZodString>;
984
+ module: zod.ZodOptional<zod.ZodString>;
985
+ cause: zod.ZodOptional<zod.ZodUnknown>;
986
+ suggestion: zod.ZodOptional<zod.ZodString>;
987
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
988
+ }, zod_v4_core.$strip>;
989
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
990
+ };
991
+ permissions: {
992
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
993
+ page: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
994
+ pageSize: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
995
+ search: zod.ZodOptional<zod.ZodString>;
996
+ type: zod.ZodOptional<zod.ZodEnum<{
997
+ menu: "menu";
998
+ api: "api";
999
+ button: "button";
1000
+ }>>;
1001
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1002
+ success: zod.ZodLiteral<true>;
1003
+ data: zod.ZodObject<{
1004
+ items: zod.ZodArray<zod.ZodObject<{
1005
+ id: zod.ZodString;
1006
+ code: zod.ZodString;
1007
+ name: zod.ZodString;
1008
+ description: zod.ZodOptional<zod.ZodString>;
1009
+ type: zod.ZodOptional<zod.ZodEnum<{
1010
+ menu: "menu";
1011
+ api: "api";
1012
+ button: "button";
1013
+ }>>;
1014
+ resource: zod.ZodOptional<zod.ZodString>;
1015
+ action: zod.ZodOptional<zod.ZodString>;
1016
+ createdAt: zod.ZodCoercedDate<unknown>;
1017
+ updatedAt: zod.ZodCoercedDate<unknown>;
1018
+ }, zod_v4_core.$strip>>;
1019
+ total: zod.ZodNumber;
1020
+ page: zod.ZodNumber;
1021
+ pageSize: zod.ZodNumber;
1022
+ }, zod_v4_core.$strip>;
1023
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1024
+ success: zod.ZodLiteral<false>;
1025
+ error: zod.ZodObject<{
1026
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1027
+ message: zod.ZodString;
1028
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1029
+ system: zod.ZodOptional<zod.ZodString>;
1030
+ module: zod.ZodOptional<zod.ZodString>;
1031
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1032
+ suggestion: zod.ZodOptional<zod.ZodString>;
1033
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1034
+ }, zod_v4_core.$strip>;
1035
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1036
+ get: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1037
+ id: zod.ZodString;
1038
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1039
+ success: zod.ZodLiteral<true>;
1040
+ data: zod.ZodNullable<zod.ZodObject<{
1041
+ id: zod.ZodString;
1042
+ code: zod.ZodString;
1043
+ name: zod.ZodString;
1044
+ description: zod.ZodOptional<zod.ZodString>;
1045
+ type: zod.ZodOptional<zod.ZodEnum<{
1046
+ menu: "menu";
1047
+ api: "api";
1048
+ button: "button";
1049
+ }>>;
1050
+ resource: zod.ZodOptional<zod.ZodString>;
1051
+ action: zod.ZodOptional<zod.ZodString>;
1052
+ createdAt: zod.ZodCoercedDate<unknown>;
1053
+ updatedAt: zod.ZodCoercedDate<unknown>;
1054
+ }, zod_v4_core.$strip>>;
1055
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1056
+ success: zod.ZodLiteral<false>;
1057
+ error: zod.ZodObject<{
1058
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1059
+ message: zod.ZodString;
1060
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1061
+ system: zod.ZodOptional<zod.ZodString>;
1062
+ module: zod.ZodOptional<zod.ZodString>;
1063
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1064
+ suggestion: zod.ZodOptional<zod.ZodString>;
1065
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1066
+ }, zod_v4_core.$strip>;
1067
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1068
+ create: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1069
+ code: zod.ZodString;
1070
+ name: zod.ZodString;
1071
+ description: zod.ZodOptional<zod.ZodString>;
1072
+ resource: zod.ZodOptional<zod.ZodString>;
1073
+ action: zod.ZodOptional<zod.ZodString>;
1074
+ type: zod.ZodOptional<zod.ZodEnum<{
1075
+ menu: "menu";
1076
+ api: "api";
1077
+ button: "button";
1078
+ }>>;
1079
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1080
+ success: zod.ZodLiteral<true>;
1081
+ data: zod.ZodObject<{
1082
+ id: zod.ZodString;
1083
+ code: zod.ZodString;
1084
+ name: zod.ZodString;
1085
+ description: zod.ZodOptional<zod.ZodString>;
1086
+ type: zod.ZodOptional<zod.ZodEnum<{
1087
+ menu: "menu";
1088
+ api: "api";
1089
+ button: "button";
1090
+ }>>;
1091
+ resource: zod.ZodOptional<zod.ZodString>;
1092
+ action: zod.ZodOptional<zod.ZodString>;
1093
+ createdAt: zod.ZodCoercedDate<unknown>;
1094
+ updatedAt: zod.ZodCoercedDate<unknown>;
1095
+ }, zod_v4_core.$strip>;
1096
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1097
+ success: zod.ZodLiteral<false>;
1098
+ error: zod.ZodObject<{
1099
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1100
+ message: zod.ZodString;
1101
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1102
+ system: zod.ZodOptional<zod.ZodString>;
1103
+ module: zod.ZodOptional<zod.ZodString>;
1104
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1105
+ suggestion: zod.ZodOptional<zod.ZodString>;
1106
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1107
+ }, zod_v4_core.$strip>;
1108
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1109
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1110
+ id: zod.ZodString;
1111
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1112
+ success: zod.ZodLiteral<true>;
1113
+ data: zod.ZodVoid;
1114
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1115
+ success: zod.ZodLiteral<false>;
1116
+ error: zod.ZodObject<{
1117
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1118
+ message: zod.ZodString;
1119
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1120
+ system: zod.ZodOptional<zod.ZodString>;
1121
+ module: zod.ZodOptional<zod.ZodString>;
1122
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1123
+ suggestion: zod.ZodOptional<zod.ZodString>;
1124
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1125
+ }, zod_v4_core.$strip>;
1126
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1127
+ };
1128
+ };
1129
+ readonly storage: {
1130
+ presignedUrls: {
1131
+ createDownload: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1132
+ key: zod.ZodString;
1133
+ expiresIn: zod.ZodOptional<zod.ZodNumber>;
1134
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1135
+ success: zod.ZodLiteral<true>;
1136
+ data: zod.ZodObject<{
1137
+ url: zod.ZodString;
1138
+ key: zod.ZodString;
1139
+ expiresAt: zod.ZodOptional<zod.ZodCoercedDate<unknown>>;
1140
+ }, zod_v4_core.$strip>;
1141
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1142
+ success: zod.ZodLiteral<false>;
1143
+ error: zod.ZodObject<{
1144
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1145
+ message: zod.ZodString;
1146
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1147
+ system: zod.ZodOptional<zod.ZodString>;
1148
+ module: zod.ZodOptional<zod.ZodString>;
1149
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1150
+ suggestion: zod.ZodOptional<zod.ZodString>;
1151
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1152
+ }, zod_v4_core.$strip>;
1153
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1154
+ createUpload: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1155
+ key: zod.ZodString;
1156
+ contentType: zod.ZodOptional<zod.ZodString>;
1157
+ contentLength: zod.ZodOptional<zod.ZodNumber>;
1158
+ expiresIn: zod.ZodOptional<zod.ZodNumber>;
1159
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1160
+ success: zod.ZodLiteral<true>;
1161
+ data: zod.ZodObject<{
1162
+ url: zod.ZodString;
1163
+ key: zod.ZodString;
1164
+ expiresAt: zod.ZodOptional<zod.ZodCoercedDate<unknown>>;
1165
+ }, zod_v4_core.$strip>;
1166
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1167
+ success: zod.ZodLiteral<false>;
1168
+ error: zod.ZodObject<{
1169
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1170
+ message: zod.ZodString;
1171
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1172
+ system: zod.ZodOptional<zod.ZodString>;
1173
+ module: zod.ZodOptional<zod.ZodString>;
1174
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1175
+ suggestion: zod.ZodOptional<zod.ZodString>;
1176
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1177
+ }, zod_v4_core.$strip>;
1178
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1179
+ };
1180
+ files: {
1181
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1182
+ prefix: zod.ZodOptional<zod.ZodString>;
1183
+ maxKeys: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
1184
+ continuationToken: zod.ZodOptional<zod.ZodString>;
1185
+ delimiter: zod.ZodOptional<zod.ZodString>;
1186
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1187
+ success: zod.ZodLiteral<true>;
1188
+ data: zod.ZodObject<{
1189
+ files: zod.ZodArray<zod.ZodObject<{
1190
+ key: zod.ZodString;
1191
+ size: zod.ZodNumber;
1192
+ contentType: zod.ZodString;
1193
+ lastModified: zod.ZodCoercedDate<unknown>;
1194
+ etag: zod.ZodOptional<zod.ZodString>;
1195
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodString>>;
1196
+ }, zod_v4_core.$strip>>;
1197
+ commonPrefixes: zod.ZodArray<zod.ZodString>;
1198
+ nextContinuationToken: zod.ZodOptional<zod.ZodString>;
1199
+ isTruncated: zod.ZodBoolean;
1200
+ }, zod_v4_core.$strip>;
1201
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1202
+ success: zod.ZodLiteral<false>;
1203
+ error: zod.ZodObject<{
1204
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1205
+ message: zod.ZodString;
1206
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1207
+ system: zod.ZodOptional<zod.ZodString>;
1208
+ module: zod.ZodOptional<zod.ZodString>;
1209
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1210
+ suggestion: zod.ZodOptional<zod.ZodString>;
1211
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1212
+ }, zod_v4_core.$strip>;
1213
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1214
+ getMetadata: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1215
+ key: zod.ZodString;
1216
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1217
+ success: zod.ZodLiteral<true>;
1218
+ data: zod.ZodObject<{
1219
+ key: zod.ZodString;
1220
+ size: zod.ZodNumber;
1221
+ contentType: zod.ZodString;
1222
+ lastModified: zod.ZodCoercedDate<unknown>;
1223
+ etag: zod.ZodOptional<zod.ZodString>;
1224
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodString>>;
1225
+ }, zod_v4_core.$strip>;
1226
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1227
+ success: zod.ZodLiteral<false>;
1228
+ error: zod.ZodObject<{
1229
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1230
+ message: zod.ZodString;
1231
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1232
+ system: zod.ZodOptional<zod.ZodString>;
1233
+ module: zod.ZodOptional<zod.ZodString>;
1234
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1235
+ suggestion: zod.ZodOptional<zod.ZodString>;
1236
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1237
+ }, zod_v4_core.$strip>;
1238
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1239
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1240
+ key: zod.ZodString;
1241
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1242
+ success: zod.ZodLiteral<true>;
1243
+ data: zod.ZodVoid;
1244
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1245
+ success: zod.ZodLiteral<false>;
1246
+ error: zod.ZodObject<{
1247
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1248
+ message: zod.ZodString;
1249
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1250
+ system: zod.ZodOptional<zod.ZodString>;
1251
+ module: zod.ZodOptional<zod.ZodString>;
1252
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1253
+ suggestion: zod.ZodOptional<zod.ZodString>;
1254
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1255
+ }, zod_v4_core.$strip>;
1256
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1257
+ deleteMany: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1258
+ keys: zod.ZodArray<zod.ZodString>;
1259
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1260
+ success: zod.ZodLiteral<true>;
1261
+ data: zod.ZodVoid;
1262
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1263
+ success: zod.ZodLiteral<false>;
1264
+ error: zod.ZodObject<{
1265
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1266
+ message: zod.ZodString;
1267
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1268
+ system: zod.ZodOptional<zod.ZodString>;
1269
+ module: zod.ZodOptional<zod.ZodString>;
1270
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1271
+ suggestion: zod.ZodOptional<zod.ZodString>;
1272
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1273
+ }, zod_v4_core.$strip>;
1274
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1275
+ };
1276
+ };
1277
+ readonly ai: {
1278
+ chats: {
1279
+ createCompletion: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1280
+ model: zod.ZodOptional<zod.ZodString>;
1281
+ messages: zod.ZodArray<zod.ZodObject<{
1282
+ role: zod.ZodEnum<{
1283
+ system: "system";
1284
+ user: "user";
1285
+ assistant: "assistant";
1286
+ tool: "tool";
1287
+ }>;
1288
+ content: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
1289
+ type: zod.ZodLiteral<"text">;
1290
+ text: zod.ZodString;
1291
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1292
+ type: zod.ZodLiteral<"image_url">;
1293
+ image_url: zod.ZodObject<{
1294
+ url: zod.ZodString;
1295
+ detail: zod.ZodOptional<zod.ZodEnum<{
1296
+ auto: "auto";
1297
+ low: "low";
1298
+ high: "high";
1299
+ }>>;
1300
+ }, zod_v4_core.$strip>;
1301
+ }, zod_v4_core.$strip>]>>]>>;
1302
+ name: zod.ZodOptional<zod.ZodString>;
1303
+ tool_calls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
1304
+ id: zod.ZodString;
1305
+ type: zod.ZodLiteral<"function">;
1306
+ function: zod.ZodObject<{
1307
+ name: zod.ZodString;
1308
+ arguments: zod.ZodString;
1309
+ }, zod_v4_core.$strip>;
1310
+ }, zod_v4_core.$strip>>>;
1311
+ tool_call_id: zod.ZodOptional<zod.ZodString>;
1312
+ }, zod_v4_core.$strip>>;
1313
+ temperature: zod.ZodOptional<zod.ZodNumber>;
1314
+ top_p: zod.ZodOptional<zod.ZodNumber>;
1315
+ max_tokens: zod.ZodOptional<zod.ZodNumber>;
1316
+ stream: zod.ZodOptional<zod.ZodBoolean>;
1317
+ tools: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
1318
+ type: zod.ZodLiteral<"function">;
1319
+ function: zod.ZodObject<{
1320
+ name: zod.ZodString;
1321
+ description: zod.ZodOptional<zod.ZodString>;
1322
+ parameters: zod.ZodOptional<zod.ZodObject<{
1323
+ type: zod.ZodLiteral<"object">;
1324
+ properties: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodObject<{
1325
+ type: zod.ZodString;
1326
+ description: zod.ZodOptional<zod.ZodString>;
1327
+ enum: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
1328
+ }, zod_v4_core.$strip>>>;
1329
+ required: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
1330
+ }, zod_v4_core.$strip>>;
1331
+ }, zod_v4_core.$strip>;
1332
+ }, zod_v4_core.$strip>>>;
1333
+ tool_choice: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodLiteral<"auto">, zod.ZodLiteral<"none">, zod.ZodObject<{
1334
+ type: zod.ZodLiteral<"function">;
1335
+ function: zod.ZodObject<{
1336
+ name: zod.ZodString;
1337
+ }, zod_v4_core.$strip>;
1338
+ }, zod_v4_core.$strip>]>>;
1339
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1340
+ success: zod.ZodLiteral<true>;
1341
+ data: zod.ZodObject<{
1342
+ id: zod.ZodString;
1343
+ object: zod.ZodLiteral<"chat.completion">;
1344
+ created: zod.ZodNumber;
1345
+ model: zod.ZodString;
1346
+ choices: zod.ZodArray<zod.ZodObject<{
1347
+ index: zod.ZodNumber;
1348
+ message: zod.ZodObject<{
1349
+ role: zod.ZodLiteral<"assistant">;
1350
+ content: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
1351
+ tool_calls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
1352
+ id: zod.ZodString;
1353
+ type: zod.ZodLiteral<"function">;
1354
+ function: zod.ZodObject<{
1355
+ name: zod.ZodString;
1356
+ arguments: zod.ZodString;
1357
+ }, zod_v4_core.$strip>;
1358
+ }, zod_v4_core.$strip>>>;
1359
+ }, zod_v4_core.$strip>;
1360
+ finish_reason: zod.ZodEnum<{
1361
+ length: "length";
1362
+ tool_calls: "tool_calls";
1363
+ stop: "stop";
1364
+ content_filter: "content_filter";
1365
+ }>;
1366
+ }, zod_v4_core.$strip>>;
1367
+ usage: zod.ZodObject<{
1368
+ prompt_tokens: zod.ZodNumber;
1369
+ completion_tokens: zod.ZodNumber;
1370
+ total_tokens: zod.ZodNumber;
1371
+ }, zod_v4_core.$strip>;
1372
+ }, zod_v4_core.$strip>;
1373
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1374
+ success: zod.ZodLiteral<false>;
1375
+ error: zod.ZodObject<{
1376
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1377
+ message: zod.ZodString;
1378
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1379
+ system: zod.ZodOptional<zod.ZodString>;
1380
+ module: zod.ZodOptional<zod.ZodString>;
1381
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1382
+ suggestion: zod.ZodOptional<zod.ZodString>;
1383
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1384
+ }, zod_v4_core.$strip>;
1385
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1386
+ sendMessage: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1387
+ message: zod.ZodString;
1388
+ systemPrompt: zod.ZodOptional<zod.ZodString>;
1389
+ model: zod.ZodOptional<zod.ZodString>;
1390
+ temperature: zod.ZodOptional<zod.ZodNumber>;
1391
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1392
+ success: zod.ZodLiteral<true>;
1393
+ data: zod.ZodObject<{
1394
+ content: zod.ZodString;
1395
+ model: zod.ZodString;
1396
+ usage: zod.ZodOptional<zod.ZodObject<{
1397
+ prompt_tokens: zod.ZodNumber;
1398
+ completion_tokens: zod.ZodNumber;
1399
+ total_tokens: zod.ZodNumber;
1400
+ }, zod_v4_core.$strip>>;
1401
+ }, zod_v4_core.$strip>;
1402
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1403
+ success: zod.ZodLiteral<false>;
1404
+ error: zod.ZodObject<{
1405
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1406
+ message: zod.ZodString;
1407
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1408
+ system: zod.ZodOptional<zod.ZodString>;
1409
+ module: zod.ZodOptional<zod.ZodString>;
1410
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1411
+ suggestion: zod.ZodOptional<zod.ZodString>;
1412
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1413
+ }, zod_v4_core.$strip>;
1414
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1415
+ listHistory: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1416
+ objectId: zod.ZodString;
1417
+ sessionId: zod.ZodString;
1418
+ limit: zod.ZodOptional<zod.ZodNumber>;
1419
+ order: zod.ZodOptional<zod.ZodEnum<{
1420
+ asc: "asc";
1421
+ desc: "desc";
1422
+ }>>;
1423
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1424
+ success: zod.ZodLiteral<true>;
1425
+ data: zod.ZodObject<{
1426
+ items: zod.ZodArray<zod.ZodObject<{
1427
+ id: zod.ZodString;
1428
+ objectId: zod.ZodString;
1429
+ sessionId: zod.ZodString;
1430
+ request: zod.ZodObject<{
1431
+ model: zod.ZodString;
1432
+ messages: zod.ZodArray<zod.ZodObject<{
1433
+ role: zod.ZodEnum<{
1434
+ system: "system";
1435
+ user: "user";
1436
+ assistant: "assistant";
1437
+ tool: "tool";
1438
+ }>;
1439
+ content: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
1440
+ type: zod.ZodLiteral<"text">;
1441
+ text: zod.ZodString;
1442
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1443
+ type: zod.ZodLiteral<"image_url">;
1444
+ image_url: zod.ZodObject<{
1445
+ url: zod.ZodString;
1446
+ detail: zod.ZodOptional<zod.ZodEnum<{
1447
+ auto: "auto";
1448
+ low: "low";
1449
+ high: "high";
1450
+ }>>;
1451
+ }, zod_v4_core.$strip>;
1452
+ }, zod_v4_core.$strip>]>>]>>;
1453
+ name: zod.ZodOptional<zod.ZodString>;
1454
+ tool_calls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
1455
+ id: zod.ZodString;
1456
+ type: zod.ZodLiteral<"function">;
1457
+ function: zod.ZodObject<{
1458
+ name: zod.ZodString;
1459
+ arguments: zod.ZodString;
1460
+ }, zod_v4_core.$strip>;
1461
+ }, zod_v4_core.$strip>>>;
1462
+ tool_call_id: zod.ZodOptional<zod.ZodString>;
1463
+ }, zod_v4_core.$strip>>;
1464
+ }, zod_v4_core.$strip>;
1465
+ response: zod.ZodObject<{
1466
+ content: zod.ZodString;
1467
+ toolCalls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
1468
+ id: zod.ZodString;
1469
+ type: zod.ZodLiteral<"function">;
1470
+ function: zod.ZodObject<{
1471
+ name: zod.ZodString;
1472
+ arguments: zod.ZodString;
1473
+ }, zod_v4_core.$strip>;
1474
+ }, zod_v4_core.$strip>>>;
1475
+ finishReason: zod.ZodString;
1476
+ usage: zod.ZodObject<{
1477
+ prompt_tokens: zod.ZodNumber;
1478
+ completion_tokens: zod.ZodNumber;
1479
+ total_tokens: zod.ZodNumber;
1480
+ }, zod_v4_core.$strip>;
1481
+ }, zod_v4_core.$strip>;
1482
+ createdAt: zod.ZodNumber;
1483
+ duration: zod.ZodNumber;
1484
+ }, zod_v4_core.$strip>>;
1485
+ }, zod_v4_core.$strip>;
1486
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1487
+ success: zod.ZodLiteral<false>;
1488
+ error: zod.ZodObject<{
1489
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1490
+ message: zod.ZodString;
1491
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1492
+ system: zod.ZodOptional<zod.ZodString>;
1493
+ module: zod.ZodOptional<zod.ZodString>;
1494
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1495
+ suggestion: zod.ZodOptional<zod.ZodString>;
1496
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1497
+ }, zod_v4_core.$strip>;
1498
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1499
+ };
1500
+ memories: {
1501
+ recall: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1502
+ query: zod.ZodString;
1503
+ topK: zod.ZodOptional<zod.ZodNumber>;
1504
+ types: zod.ZodOptional<zod.ZodArray<zod.ZodEnum<{
1505
+ fact: "fact";
1506
+ preference: "preference";
1507
+ event: "event";
1508
+ entity: "entity";
1509
+ instruction: "instruction";
1510
+ }>>>;
1511
+ minImportance: zod.ZodOptional<zod.ZodNumber>;
1512
+ objectId: zod.ZodOptional<zod.ZodString>;
1513
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1514
+ success: zod.ZodLiteral<true>;
1515
+ data: zod.ZodObject<{
1516
+ items: zod.ZodArray<zod.ZodObject<{
1517
+ id: zod.ZodString;
1518
+ content: zod.ZodString;
1519
+ type: zod.ZodEnum<{
1520
+ fact: "fact";
1521
+ preference: "preference";
1522
+ event: "event";
1523
+ entity: "entity";
1524
+ instruction: "instruction";
1525
+ }>;
1526
+ importance: zod.ZodNumber;
1527
+ objectId: zod.ZodOptional<zod.ZodString>;
1528
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1529
+ createdAt: zod.ZodNumber;
1530
+ lastAccessedAt: zod.ZodNumber;
1531
+ accessCount: zod.ZodNumber;
1532
+ }, zod_v4_core.$strip>>;
1533
+ }, zod_v4_core.$strip>;
1534
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1535
+ success: zod.ZodLiteral<false>;
1536
+ error: zod.ZodObject<{
1537
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1538
+ message: zod.ZodString;
1539
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1540
+ system: zod.ZodOptional<zod.ZodString>;
1541
+ module: zod.ZodOptional<zod.ZodString>;
1542
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1543
+ suggestion: zod.ZodOptional<zod.ZodString>;
1544
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1545
+ }, zod_v4_core.$strip>;
1546
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1547
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1548
+ types: zod.ZodOptional<zod.ZodArray<zod.ZodEnum<{
1549
+ fact: "fact";
1550
+ preference: "preference";
1551
+ event: "event";
1552
+ entity: "entity";
1553
+ instruction: "instruction";
1554
+ }>>>;
1555
+ objectId: zod.ZodOptional<zod.ZodString>;
1556
+ offset: zod.ZodOptional<zod.ZodNumber>;
1557
+ limit: zod.ZodOptional<zod.ZodNumber>;
1558
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1559
+ success: zod.ZodLiteral<true>;
1560
+ data: zod.ZodObject<{
1561
+ items: zod.ZodArray<zod.ZodObject<{
1562
+ id: zod.ZodString;
1563
+ content: zod.ZodString;
1564
+ type: zod.ZodEnum<{
1565
+ fact: "fact";
1566
+ preference: "preference";
1567
+ event: "event";
1568
+ entity: "entity";
1569
+ instruction: "instruction";
1570
+ }>;
1571
+ importance: zod.ZodNumber;
1572
+ objectId: zod.ZodOptional<zod.ZodString>;
1573
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1574
+ createdAt: zod.ZodNumber;
1575
+ lastAccessedAt: zod.ZodNumber;
1576
+ accessCount: zod.ZodNumber;
1577
+ }, zod_v4_core.$strip>>;
1578
+ total: zod.ZodNumber;
1579
+ }, zod_v4_core.$strip>;
1580
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1581
+ success: zod.ZodLiteral<false>;
1582
+ error: zod.ZodObject<{
1583
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1584
+ message: zod.ZodString;
1585
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1586
+ system: zod.ZodOptional<zod.ZodString>;
1587
+ module: zod.ZodOptional<zod.ZodString>;
1588
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1589
+ suggestion: zod.ZodOptional<zod.ZodString>;
1590
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1591
+ }, zod_v4_core.$strip>;
1592
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1593
+ };
1594
+ sessions: {
1595
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1596
+ objectId: zod.ZodString;
1597
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1598
+ success: zod.ZodLiteral<true>;
1599
+ data: zod.ZodObject<{
1600
+ items: zod.ZodArray<zod.ZodObject<{
1601
+ objectId: zod.ZodString;
1602
+ sessionId: zod.ZodString;
1603
+ createdAt: zod.ZodNumber;
1604
+ updatedAt: zod.ZodNumber;
1605
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1606
+ }, zod_v4_core.$strip>>;
1607
+ }, zod_v4_core.$strip>;
1608
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1609
+ success: zod.ZodLiteral<false>;
1610
+ error: zod.ZodObject<{
1611
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1612
+ message: zod.ZodString;
1613
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1614
+ system: zod.ZodOptional<zod.ZodString>;
1615
+ module: zod.ZodOptional<zod.ZodString>;
1616
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1617
+ suggestion: zod.ZodOptional<zod.ZodString>;
1618
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1619
+ }, zod_v4_core.$strip>;
1620
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1621
+ };
1622
+ };
1623
+ }>;
1624
+ /** `apiClient` 默认单例 + 工厂命名空间的统一对外类型。 */
1625
+ type DefaultApiClient = ApiClient<typeof defaultApiContract> & {
1626
+ readonly create: typeof createApiClient;
1627
+ readonly tokenStorage: typeof tokenStorage;
1628
+ };
1629
+ /** hai-framework API client 统一入口(默认单例 + `create` + `tokenStorage`)。 */
1630
+ declare const apiClient: DefaultApiClient;
347
1631
 
348
- export { type ApiClient, type ApiClientConfig, type ApiClientFunctions, type AuthConfig, type EndpointDef, HaiApiClientError, type RequestConfig, type RequestInterceptor, type ResponseInterceptor, type StreamOptions, type TokenPair, type TokenStorage, type UploadOptions, api, createLocalStorageTokenStorage, createMemoryTokenStorage, defineEndpoint };
1632
+ export { type ApiClient, type ApiClientAuth, type ApiClientConfig, type ApiClientLifecycle, type ApiClientTransportConfig, type AuthConfig, type DefaultApiClient, HaiApiClientError, type TokenManager, type TokenPair, type TokenStorage, apiClient };