@h-ai/api-client 0.1.0-alpha8 → 1.0.0-beta.1

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,34 @@
1
+ import * as _orpc_client from '@orpc/client';
2
+ import * as _h_ai_api_contract from '@h-ai/api-contract';
3
+ import { apiContract, IamLoginInput, IamRegisterInput } from '@h-ai/api-contract';
1
4
  import * as _h_ai_core from '@h-ai/core';
2
5
  import { HaiResult } from '@h-ai/core';
3
- import { z } from 'zod';
6
+ import { CryptoFunctions } from '@h-ai/crypto';
7
+ import * as _orpc_contract from '@orpc/contract';
8
+ import { AnyContractRouter, ContractRouterClient } from '@orpc/contract';
9
+ import { JsonifiedClient } from '@orpc/openapi-client';
10
+ import * as zod_v4_core from 'zod/v4/core';
11
+ import * as zod from 'zod';
4
12
 
13
+ /**
14
+ * 客户端标准错误集合;包含稳定 code/httpStatus 与构造错误的方法,业务调用先检查 success。
15
+ * 传输失败在 procedure 代理中映射;服务端 HaiResult 的业务错误保持原契约。
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { apiClient, HaiApiClientError } from '@h-ai/api-client'
20
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1' })
21
+ * if (!initialized.success) throw new Error(initialized.error.message)
22
+ * try {
23
+ * const result = await apiClient.iam.auth.currentUser()
24
+ * if (!result.success && result.error.code === HaiApiClientError.UNAUTHORIZED.code) {
25
+ * // 由应用切换到登录页面;不输出 Token。
26
+ * const message = result.error.message
27
+ * }
28
+ * }
29
+ * finally { await apiClient.close() }
30
+ * ```
31
+ */
5
32
  declare const HaiApiClientError: {
6
33
  readonly NETWORK_ERROR: _h_ai_core.HaiErrorDef;
7
34
  readonly TIMEOUT: _h_ai_core.HaiErrorDef;
@@ -11,338 +38,2819 @@ declare const HaiApiClientError: {
11
38
  readonly NOT_FOUND: _h_ai_core.HaiErrorDef;
12
39
  readonly VALIDATION_FAILED: _h_ai_core.HaiErrorDef;
13
40
  readonly TOKEN_REFRESH_FAILED: _h_ai_core.HaiErrorDef;
41
+ readonly PAYLOAD_TOO_LARGE: _h_ai_core.HaiErrorDef;
14
42
  readonly NOT_INITIALIZED: _h_ai_core.HaiErrorDef;
15
43
  readonly CONFIG_ERROR: _h_ai_core.HaiErrorDef;
16
44
  readonly UNKNOWN: _h_ai_core.HaiErrorDef;
17
45
  };
18
46
  /**
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 推导)
47
+ * 短期 access token、可选 refresh token 与有效期;HTTP 头使用 Bearer。
48
+ * Cookie 模式的 refresh token 由服务端管理,不能要求浏览器读取或持久化它。
27
49
  *
28
50
  * @example
29
51
  * ```ts
30
- * const loginEndpoint: EndpointDef<LoginInput, LoginOutput> = {
31
- * method: 'POST',
32
- * path: '/auth/login',
33
- * input: LoginInputSchema,
34
- * output: LoginOutputSchema,
35
- * requireAuth: false,
36
- * }
52
+ * import type { TokenPair } from '@h-ai/api-client'
53
+ * const tokens: TokenPair = { accessToken: 'test-access', expiresIn: 3600, tokenType: 'Bearer' }
54
+ * // 示例为测试凭据;生产 Token 只能来自可信服务端认证响应。
37
55
  * ```
38
56
  */
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
- */
59
57
  interface TokenPair {
60
- /** Access Token */
61
- accessToken: string;
62
- /** Refresh Token */
63
- refreshToken: string;
64
- /** 过期时间(秒) */
65
- expiresIn: number;
66
- /** Token 类型 */
67
- tokenType: 'Bearer';
58
+ /** 短期访问凭证,请求时作为 `Authorization: Bearer ...`。 */
59
+ readonly accessToken: string;
60
+ /** 长期刷新凭证;httpOnly cookie 模式下由服务端管理,响应体中可能不存在。 */
61
+ readonly refreshToken?: string;
62
+ /** accessToken 有效期秒数。 */
63
+ readonly expiresIn: number;
64
+ /** 固定为 `'Bearer'`。 */
65
+ readonly tokenType: 'Bearer';
68
66
  }
69
67
  /**
70
- * Token 存储适配器
68
+ * 异步安全凭据存储契约;null 仅表示无可用凭据,读写故障须拒绝 Promise。
69
+ * 浏览器使用内存 access token/httpOnly refresh Cookie,原生端注入平台安全存储,禁止敏感 Token 放入 localStorage。
70
+ * 已绑定客户端的身份切换通过 client.auth,避免绕过刷新代际与串行写入;部分写入失败须执行清理并报告清理失败。
71
+ *
72
+ * 内置实现:
73
+ * - `apiClient.tokenStorage.httpOnlyCookie()` — **默认**;浏览器端推荐,refresh token 由服务端管理,防 XSS。
74
+ * - `apiClient.tokenStorage.memory()` — Node.js 测试 / SSR(需显式传入)。
75
+ *
76
+ * Capacitor / 小程序场景请由对应模块提供(例如 `@h-ai/capacitor`)。
71
77
  *
72
- * 可插拔存储后端(localStorage / memory / Capacitor Preferences / 自定义)。
78
+ * @example
79
+ * ```ts
80
+ * import { apiClient, type TokenStorage } from '@h-ai/api-client'
81
+ * const storage: TokenStorage = apiClient.tokenStorage.memory()
82
+ * await storage.setAccessToken('test-access')
83
+ * const accessToken = await storage.getAccessToken()
84
+ * await storage.clear()
85
+ * ```
73
86
  */
74
87
  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>;
85
- }
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;
88
+ /**
89
+ * 读取本适配器可用 access token;无凭据返回 null,存储故障拒绝。
90
+ * @returns Token 或 null;不能把读取失败当成不存在。
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * import { apiClient } from '@h-ai/api-client'
95
+ * const storage = apiClient.tokenStorage.memory()
96
+ * const accessToken = await storage.getAccessToken()
97
+ * ```
98
+ */
99
+ readonly getAccessToken: () => Promise<string | null>;
100
+ /**
101
+ * 保存 access token;已绑定客户端应通过 auth.setTokens 维护代际。
102
+ * @param token - 可信服务端认证返回的 access token。
103
+ * @returns 写入完成;底层故障须拒绝。
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * import { apiClient } from '@h-ai/api-client'
108
+ * const storage = apiClient.tokenStorage.memory()
109
+ * await storage.setAccessToken('test-access')
110
+ * await storage.clear()
111
+ * ```
112
+ */
113
+ readonly setAccessToken: (token: string) => Promise<void>;
114
+ /**
115
+ * 读取 refresh token 或 Cookie 模式内部哨兵;null 仅表示没有凭据。
116
+ * @returns Token、模式哨兵或 null,不是对 httpOnly Cookie 内容的脚本读取。
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * import { apiClient } from '@h-ai/api-client'
121
+ * const storage = apiClient.tokenStorage.memory()
122
+ * const refreshToken = await storage.getRefreshToken()
123
+ * // 内存适配器初始为空;Cookie 适配器由管理器识别模式哨兵。
124
+ * ```
125
+ */
126
+ readonly getRefreshToken: () => Promise<string | null>;
127
+ /**
128
+ * 保存 refresh token;Cookie 实现不通过脚本修改服务端 Cookie。
129
+ * @param token - 服务端返回的刷新凭据;禁止写入 Web Storage。
130
+ * @returns 写入完成;原生安全存储故障须拒绝。
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * import { apiClient } from '@h-ai/api-client'
135
+ * const storage = apiClient.tokenStorage.memory()
136
+ * await storage.setRefreshToken('test-refresh')
137
+ * await storage.clear()
138
+ * ```
139
+ */
140
+ readonly setRefreshToken: (token: string) => Promise<void>;
141
+ /**
142
+ * 清空适配器可管理的凭据;Cookie 实现只能清内存 access token。
143
+ * @returns 清理完成;失败须拒绝,服务端 Cookie/会话另由退出接口撤销。
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * import { apiClient } from '@h-ai/api-client'
148
+ * const storage = apiClient.tokenStorage.memory()
149
+ * await storage.clear()
150
+ * const remaining = await storage.getAccessToken()
151
+ * ```
152
+ */
153
+ readonly clear: () => Promise<void>;
100
154
  }
101
- /** 请求拦截器 */
102
- type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;
103
- /** 响应拦截器 */
104
- type ResponseInterceptor = (response: Response) => Response | Promise<Response>;
105
155
  /**
106
- * Token 刷新配置
156
+ * 启用 Token 注入与自动刷新;默认 Cookie 适配器,refreshPath 相对 baseUrl。
157
+ * 网络/超时/5xx 为暂时失败,保留凭据;明确失效才清理并通知。回调不应抛出或记录 Token。
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * import { apiClient, type AuthConfig } from '@h-ai/api-client'
162
+ * const auth: AuthConfig = { storage: apiClient.tokenStorage.memory(), refreshPath: '/auth/refresh', refreshTimeoutMs: 5000, onTokenRefreshed: tokens => { const lifetime = tokens.expiresIn } }
163
+ * // Node/SSR 选择独立内存存储;浏览器通常直接配置 auth: {}。
164
+ * ```
107
165
  */
108
166
  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;
167
+ /** refresh明确失效后原地恢复同一用户会话,成功时只重试原请求一次;取消/结果不明不得返回true。 */
168
+ readonly recoverSession?: () => Promise<boolean>;
169
+ /** 登录会话终端分组;默认web,可选app/desktop/api。服务端必须允许该类;不代表物理设备证明。 */
170
+ readonly terminalType?: 'web' | 'app' | 'desktop' | 'api';
171
+ /**
172
+ * Token 存储适配器;默认 `apiClient.tokenStorage.httpOnlyCookie()`(refresh token 由服务端管理,防 XSS)。
173
+ *
174
+ * - SSR / Node.js 测试场景请显式传入 `apiClient.tokenStorage.memory()`。
175
+ * - 浏览器刷新后通过 httpOnly Cookie 恢复会话,不将 Token 持久化到 Web Storage。
176
+ * - Capacitor / 小程序请使用对应平台的安全存储适配器(如 `@h-ai/capacitor`)。
177
+ */
178
+ readonly storage?: TokenStorage;
179
+ /** 刷新接口路径,相对于 `baseUrl`,默认 `/auth/refresh`。 */
180
+ readonly refreshPath?: string;
181
+ /**
182
+ * 刷新请求超时(ms),默认 10_000。
183
+ * 避免 refresh 接口上游挂死时所有 dedup 调用方一起 hang。
184
+ * 超时后按现有 transient 失败处理(不清 token,下次请求可重试)。
185
+ */
186
+ readonly refreshTimeoutMs?: number;
187
+ /** 刷新成功回调,用于同步状态(例如多 Tab 广播)。 */
188
+ readonly onTokenRefreshed?: (tokens: TokenPair) => void;
189
+ /** 刷新失败回调(如 refresh token 已失效),通常用于跳转登录页。 */
190
+ readonly onRefreshFailed?: () => void;
117
191
  }
118
192
  /**
119
- * ApiClient 配置
193
+ * 客户端初始化配置;baseUrl 包含 API 前缀,headers/fetch 用于平台适配。
194
+ * auth 缺省时不创建 TokenManager;timeout 是底层请求中断期限,不代表服务端已取消副作用。
195
+ * transport 需要已初始化 crypto,首次业务请求前协商会话;客户端不接收服务端私钥。
196
+ *
197
+ * @example
198
+ * ```ts
199
+ * import { apiClient, type ApiClientConfig } from '@h-ai/api-client'
200
+ * const config: ApiClientConfig = { baseUrl: 'https://api.example.com/api/v1', auth: { storage: apiClient.tokenStorage.memory() }, timeout: 15000, clientName: 'orders-web', headers: () => ({ 'x-app-channel': 'web' }) }
201
+ * const initialized = await apiClient.init(config)
202
+ * if (!initialized.success) throw new Error(initialized.error.message)
203
+ * await apiClient.close()
204
+ * ```
120
205
  */
121
206
  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;
207
+ /** API service 完整 baseUrl,通常含 `apiPrefix`,例如 `https://api.example.com/api/v1`。 */
208
+ readonly baseUrl: string;
209
+ /** 认证配置;不传则不启用 Token 注入与自动刷新。 */
210
+ readonly auth?: AuthConfig;
211
+ /** 请求超时(ms),默认 30000。 */
212
+ readonly timeout?: number;
213
+ /** 客户端标识,写入 `x-request-client` 请求头,默认 `hai-api-client`。 */
214
+ readonly clientName?: string;
215
+ /** 额外请求头,可为静态对象或异步函数。 */
216
+ readonly headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);
217
+ /** 自定义 fetch(测试 mock / Capacitor / 小程序桥接)。 */
218
+ readonly fetch?: typeof globalThis.fetch;
219
+ /**
220
+ * 启用端到端传输加密(opt-in)。
221
+ *
222
+ * 配置后所有出站请求会在底层 fetch 之上做一次混合加密,并自动解密
223
+ * 标记为 `X-Encrypted: true` 的响应。服务端需启用对应的 `serv.createApp({ transport })`。
224
+ *
225
+ * `crypto` 字段结构与 `@h-ai/crypto` 的 `crypto` 实例兼容;通常直接传入:
226
+ *
227
+ * @example
228
+ * ```ts
229
+ * import { apiClient } from '@h-ai/api-client'
230
+ * import { crypto } from '@h-ai/crypto'
231
+ *
232
+ * const cryptography = await crypto.init()
233
+ * if (!cryptography.success) throw new Error(cryptography.error.message)
234
+ * try {
235
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', transport: { crypto } })
236
+ * if (!initialized.success) throw new Error(initialized.error.message)
237
+ * await apiClient.close()
238
+ * }
239
+ * finally { await crypto.close() }
240
+ * ```
241
+ */
242
+ readonly transport?: ApiClientTransportConfig;
151
243
  }
152
244
  /**
153
- * Api Client 实例接口
245
+ * 可选加密会话配置;密钥协商路径相对 baseUrl,并与服务端配置匹配。
246
+ * crypto 必须先初始化;服务器版本公钥通过受保护的 TLS 握手取得,不配置服务端私钥。
247
+ * 传输防重放不能代替业务幂等性,失败后不要自动重放非幂等操作。
154
248
  *
155
- * 提供通用 HTTP 方法和契约调用能力。
249
+ * @example
250
+ * ```ts
251
+ * import { apiClient, type ApiClientTransportConfig } from '@h-ai/api-client'
252
+ * import { crypto } from '@h-ai/crypto'
253
+ * const cryptography = await crypto.init()
254
+ * if (!cryptography.success) throw new Error(cryptography.error.message)
255
+ * try {
256
+ * const transport: ApiClientTransportConfig = { crypto, keyExchangePath: '/_hai/key-exchange' }
257
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', transport })
258
+ * if (!initialized.success) throw new Error(initialized.error.message)
259
+ * await apiClient.close()
260
+ * }
261
+ * finally { await crypto.close() }
262
+ * ```
156
263
  */
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>;
264
+ interface ApiClientTransportConfig {
265
+ /** 可选本地明文 UTF-8 字节上限;缺省自动跟随服务端,指定时取较小值。 */
266
+ readonly maxPlaintextBytes?: number;
267
+ /**
268
+ * crypto 服务实例(通常直接传入 `@h-ai/crypto` 的 `crypto`)。
269
+ * api-client 通过 `crypto.transport.createClient(...)` 创建会话。
270
+ */
271
+ readonly crypto: CryptoFunctions;
172
272
  /**
173
- * 契约调用(推荐)
273
+ * 密钥协商端点路径,相对于 `baseUrl`,默认 `/_hai/key-exchange`。
174
274
  *
175
- * 基于 EndpointDef 发起请求,路径、方法、入参、出参类型全由契约保证。
275
+ * 必须与服务端 `serv.createApp({ transport: { keyExchangePath } })` 一致。
176
276
  */
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
- };
277
+ readonly keyExchangePath?: string;
187
278
  }
188
279
  /**
189
- * 辅助函数:创建端点定义(获得类型推导)
280
+ * 当前客户端的凭据辅助操作;仅 init 启用 auth 时建立实际管理器。
281
+ * setTokens/clear 撤销旧刷新代际并等待串行存储变更;故障拒绝 Promise,调用方处理失败。
282
+ * clear 不能撤销服务端会话或删除 httpOnly Cookie,退出仍需服务端接口成功。
190
283
  *
191
284
  * @example
192
285
  * ```ts
193
- * const login = defineEndpoint({
194
- * method: 'POST',
195
- * path: '/auth/login',
196
- * input: LoginInputSchema,
197
- * output: LoginOutputSchema,
198
- * requireAuth: false,
199
- * })
286
+ * import { apiClient, type ApiClientAuth } from '@h-ai/api-client'
287
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
288
+ * if (!initialized.success) throw new Error(initialized.error.message)
289
+ * try {
290
+ * const auth: ApiClientAuth = apiClient.auth
291
+ * const off = auth.onTokenRefreshed(tokens => { const lifetime = tokens.expiresIn })
292
+ * off()
293
+ * await auth.clear()
294
+ * }
295
+ * finally { await apiClient.close() }
200
296
  * ```
201
297
  */
202
- declare function defineEndpoint<TInput, TOutput>(def: EndpointDef<TInput, TOutput>): EndpointDef<TInput, TOutput>;
298
+ interface ApiClientAuth {
299
+ /**
300
+ * 替换整对凭据并同步废弃旧刷新代际;缺省 refreshToken 时清除旧值。
301
+ * @param tokens - 服务端成功认证返回的真实 TokenPair。
302
+ * @returns 写入完成;安全存储失败拒绝 Promise,调用方应清理部分凭据并报告清理失败。
303
+ *
304
+ * @example
305
+ * ```ts
306
+ * import { apiClient } from '@h-ai/api-client'
307
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
308
+ * if (!initialized.success) throw new Error(initialized.error.message)
309
+ * try {
310
+ * const form = { identifier: 'alice', password: 'test-password' }
311
+ * const login = await apiClient.iam.auth.login(form)
312
+ * if (!login.success) throw new Error(login.error.message)
313
+ * try { await apiClient.auth.setTokens(login.data.tokens) }
314
+ * catch (writeError) {
315
+ * try { await apiClient.auth.clear() }
316
+ * catch (cleanupError) { throw new AggregateError([writeError, cleanupError], 'Credential persistence and cleanup failed') }
317
+ * throw writeError
318
+ * }
319
+ * }
320
+ * finally { await apiClient.close() }
321
+ * ```
322
+ */
323
+ readonly setTokens: (tokens: TokenPair) => Promise<void>;
324
+ /**
325
+ * 同步废弃旧刷新代际并等待存储清理;失败拒绝 Promise,不声称已持久删除。
326
+ * 服务端会话与 httpOnly Cookie 仍需服务端退出撤销;本操作不能替代退出接口。
327
+ * @returns 本地清理完成,不返回 HaiResult。
328
+ *
329
+ * @example
330
+ * ```ts
331
+ * import { apiClient } from '@h-ai/api-client'
332
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
333
+ * if (!initialized.success) throw new Error(initialized.error.message)
334
+ * try {
335
+ * const logout = await apiClient.iam.auth.logout({})
336
+ * await apiClient.auth.clear()
337
+ * if (!logout.success) throw new Error(logout.error.message)
338
+ * // 只有服务端退出和本地清理都成功,才能确认两侧均已处理。
339
+ * }
340
+ * finally { await apiClient.close() }
341
+ * ```
342
+ */
343
+ readonly clear: () => Promise<void>;
344
+ /**
345
+ * 订阅当前管理器刷新成功事件;回调在写入后同步调用,避免抛错或输出 Token。
346
+ * @param callback - 接收 TokenPair 的同步回调。
347
+ * @returns 取消订阅函数;未启用 auth 时返回空操作。
348
+ *
349
+ * @example
350
+ * ```ts
351
+ * import { apiClient } from '@h-ai/api-client'
352
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
353
+ * if (!initialized.success) throw new Error(initialized.error.message)
354
+ * try {
355
+ * const off = apiClient.auth.onTokenRefreshed(tokens => { const expiresIn = tokens.expiresIn })
356
+ * off()
357
+ * }
358
+ * finally { await apiClient.close() }
359
+ * ```
360
+ */
361
+ readonly onTokenRefreshed: (callback: (tokens: TokenPair) => void) => () => void;
362
+ }
203
363
  /**
204
- * API 客户端函数接口(单例模式)
364
+ * 客户端生命周期与认证辅助能力;init 的 HaiResult 必须先检查 success。
365
+ * 同一实例并发 init 共享在途初始化,已初始化后再 init 返回 CONFIG_ERROR;切换配置先 close。
366
+ * config 为脱敏快照;close 清理运行状态/加密会话,不等于服务端退出或凭据存储清理。
205
367
  *
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` — 初始化状态
368
+ * @example
369
+ * ```ts
370
+ * import { apiClient, type ApiClientLifecycle } from '@h-ai/api-client'
371
+ * const client: ApiClientLifecycle = apiClient
372
+ * const initialized = await client.init({ baseUrl: 'https://api.example.com/api/v1' })
373
+ * if (!initialized.success) throw new Error(initialized.error.message)
374
+ * const active = client.isInitialized
375
+ * const snapshot = client.config
376
+ * await client.close()
377
+ * ```
216
378
  */
217
- interface ApiClientFunctions {
379
+ interface ApiClientLifecycle {
218
380
  /**
219
- * 初始化 API 客户端
220
- *
221
- * 已有实例时会先 close 再重新初始化。
222
- *
223
- * @param config - 客户端配置
224
- * @returns 成功 ok(undefined);失败返回 err(含 ApiClientError)
381
+ * 观察一次逻辑调用的最终结果;刷新重试保留关联 ID,不包含请求正文或凭据。
382
+ * close 清理订阅;回调异常不影响请求,返回函数可提前取消。
383
+ * @example
384
+ * ```ts
385
+ * import { apiClient } from '@h-ai/api-client'
386
+ * const unsubscribe = apiClient.observeRequests(record => { const requestId = record.requestId })
387
+ * unsubscribe()
388
+ * ```
225
389
  */
226
- init: (config: ApiClientConfig) => Promise<HaiResult<void>>;
390
+ readonly observeRequests: (observer: ApiRequestObserver) => () => void;
227
391
  /**
228
- * 关闭 API 客户端并释放资源
392
+ * 构造并提交客户端运行状态;初始化失败返回 CONFIG_ERROR,未提交半初始化对象。
393
+ * 并发 init 共享同一初始化;已初始化再调用会失败,切换配置先 close。
394
+ * @param config - baseUrl、认证、fetch 与可选加密配置。
395
+ * @returns HaiResult;必须先判断 success,再发起 procedure。
229
396
  *
230
- * 重复调用不会报错。
397
+ * @example
398
+ * ```ts
399
+ * import { apiClient } from '@h-ai/api-client'
400
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
401
+ * if (!initialized.success) throw new Error(initialized.error.message)
402
+ * try {
403
+ * const result = await apiClient.iam.auth.publicConfig()
404
+ * if (!result.success) throw new Error(result.error.message)
405
+ * }
406
+ * finally { await apiClient.close() }
407
+ * ```
231
408
  */
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'];
409
+ readonly init: (config: ApiClientConfig) => Promise<HaiResult<void>>;
249
410
  /**
250
- * 流式请求(返回 AsyncIterable)
411
+ * 销毁当前加密会话并清除运行状态,允许重新 init;不发送服务端退出、不清空外置存储。
412
+ * @returns 资源清理完成;不是 HaiResult,不应读取 success。
251
413
  *
252
- * @throws 未初始化时抛出异常(async generator 无法返回 HaiResult)
414
+ * @example
415
+ * ```ts
416
+ * import { apiClient } from '@h-ai/api-client'
417
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
418
+ * if (!initialized.success) throw new Error(initialized.error.message)
419
+ * await apiClient.close()
420
+ * const reinitialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
421
+ * if (!reinitialized.success) throw new Error(reinitialized.error.message)
422
+ * await apiClient.close()
423
+ * ```
253
424
  */
254
- readonly stream: ApiClient['stream'];
255
- /** 契约调用(推荐) */
256
- readonly call: ApiClient['call'];
257
- /** Token 管理 */
258
- readonly auth: ApiClient['auth'];
425
+ readonly close: () => Promise<void>;
426
+ /** 当前脱敏后的运行配置快照;未初始化时为 `null`。 */
427
+ readonly config: ApiClientConfig | null;
428
+ /** 是否已完成初始化。 */
429
+ readonly isInitialized: boolean;
430
+ /** Token 辅助操作。 */
431
+ readonly auth: ApiClientAuth;
259
432
  }
260
-
261
433
  /**
262
- * @h-ai/api-client — Token 存储适配器
434
+ * 逻辑请求诊断摘要。HTTP 200 的失败 HaiResult 同样 success=false。
435
+ * @example
436
+ * ```ts
437
+ * import type { ApiRequestRecord } from '@h-ai/api-client'
438
+ * const record: ApiRequestRecord = { requestId: 'request-1', procedure: 'orders.get', timestamp: 1, duration: 10, success: false, attempts: 1, errorCode: 'orders:missing' }
439
+ * ```
440
+ */
441
+ interface ApiRequestRecord {
442
+ readonly requestId: string;
443
+ readonly procedure: string;
444
+ readonly timestamp: number;
445
+ readonly duration: number;
446
+ readonly success: boolean;
447
+ readonly attempts: number;
448
+ readonly errorCode?: string;
449
+ readonly method?: string;
450
+ readonly url?: string;
451
+ readonly status?: number;
452
+ }
453
+ /**
454
+ * 同步观察者,只做有界收集。
455
+ * @example
456
+ * ```ts
457
+ * import { apiClient, type ApiRequestObserver } from '@h-ai/api-client'
458
+ * const observer: ApiRequestObserver = record => { const failed = !record.success }
459
+ * const unsubscribe = apiClient.observeRequests(observer)
460
+ * unsubscribe()
461
+ * ```
462
+ */
463
+ type ApiRequestObserver = (record: ApiRequestRecord) => void;
464
+ /**
465
+ * 由 oRPC 契约推导的 JSON typed client,与生命周期组合;procedure 的输入/输出由契约决定。
466
+ * 调用先检查初始化和业务 HaiResult;自定义契约不能覆盖 init/close/config/isInitialized/auth 顶层成员。
263
467
  *
264
- * 提供 localStorage 和内存两种内置 Token 存储实现。
265
- * @module api-client-auth
468
+ * @example
469
+ * ```ts
470
+ * import { apiClient, type ApiClient } from '@h-ai/api-client'
471
+ * import { apiContract } from '@h-ai/api-contract'
472
+ * const contract = apiContract.create({ iam: apiContract.iam })
473
+ * const client: ApiClient<typeof contract> = apiClient.create(contract)
474
+ * const initialized = await client.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
475
+ * if (!initialized.success) throw new Error(initialized.error.message)
476
+ * try {
477
+ * const result = await client.iam.auth.currentUser()
478
+ * if (!result.success) throw new Error(result.error.message)
479
+ * const userId = result.data.id
480
+ * }
481
+ * finally { await client.close() }
482
+ * ```
266
483
  */
484
+ type ApiClient<TContract extends AnyContractRouter> = ApiClientLifecycle & JsonifiedClient<ContractRouterClient<TContract>>;
267
485
 
268
486
  /**
269
- * 创建基于 localStorage 的 Token 存储
270
- *
271
- * 适用于浏览器端 SPA / PWA。Capacitor 环境建议使用
272
- * `@h-ai/capacitor` 提供的 `CapacitorTokenStorage`。
273
- *
274
- * @returns TokenStorage 实例
487
+ * 认证表单登录输入;默认 password,ldap 使用 identifier/password,email/sms 使用 identifier/code。
488
+ * method/code 为客户端表单辅助字段,按所选方式映射到标准 IAM procedure。
275
489
  *
276
490
  * @example
277
491
  * ```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
- * },
286
- * })
492
+ * import type { IamAuthLoginInput } from '@h-ai/api-client'
493
+ * const input: IamAuthLoginInput = { identifier: 'alice@example.com', password: '', method: 'email', code: '123456' }
287
494
  * ```
288
495
  */
289
- declare function createLocalStorageTokenStorage(): TokenStorage;
496
+ type IamAuthLoginInput = IamLoginInput & {
497
+ method?: 'password' | 'ldap' | 'email' | 'sms';
498
+ code?: string;
499
+ };
290
500
  /**
291
- * 创建内存 Token 存储
501
+ * 将含标准 IAM 契约的客户端绑定为认证表单动作;包用户通过 apiClient.createAuthActions 调用。
502
+ * 登录/注册成功后等待 client.auth.setTokens,失败 HaiResult 原样返回;存储失败拒绝 Promise,不能据服务端成功就显示已登录。
503
+ * 调用方必须先 init 并启用 auth;未启用 auth 时客户端 setTokens 不会建立 Token 管理器。
504
+ * @param client - 具有标准 IAM procedure 与 setTokens 能力的已初始化客户端。
505
+ * @param client.iam - 标准 IAM 契约的领域分组。
506
+ * @param client.iam.auth - 公开配置、登录、注册、验证码和密码重置 procedure。
507
+ * @param client.auth - 认证成功后的凭据写入能力(setTokens)。
508
+ * @returns publicConfig、按方式登录、注册、验证码和密码重置动作。
292
509
  *
293
- * 适用于 Node.js 测试、SSR 或短生命周期场景。
294
- * 页面刷新后 Token 丢失。
510
+ * @example
511
+ * ```ts
512
+ * import { apiClient } from '@h-ai/api-client'
513
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
514
+ * if (!initialized.success) throw new Error(initialized.error.message)
515
+ * try {
516
+ * const actions = apiClient.createAuthActions(apiClient)
517
+ * // 运行时凭据来自已验证的表单;此处只请求公开配置,不提交示例密码。
518
+ * const config = await actions.publicConfig()
519
+ * if (!config.success) throw new Error(config.error.message)
520
+ * }
521
+ * finally { await apiClient.close() }
522
+ * ```
523
+ */
524
+ declare function createIamAuthActions(client: {
525
+ iam: {
526
+ auth: Pick<ApiClient<{
527
+ iam: typeof apiContract.iam;
528
+ }>['iam']['auth'], 'publicConfig' | 'createCaptcha' | 'closeSession' | 'login' | 'loginWithLdap' | 'loginWithOtp' | 'register' | 'sendOtp' | 'requestPasswordReset' | 'confirmPasswordReset' | 'renewPassword' | 'reauthenticate'>;
529
+ };
530
+ auth: Pick<ApiClient<{
531
+ iam: typeof apiContract.iam;
532
+ }>['auth'], 'setTokens'>;
533
+ }): {
534
+ bindPageExit(options?: {
535
+ enabled?: boolean;
536
+ }): () => void;
537
+ publicConfig: () => _orpc_client.ClientPromiseResult<{
538
+ success: true;
539
+ data: {
540
+ captcha: {
541
+ enabled: boolean;
542
+ };
543
+ password: {
544
+ minLength: number;
545
+ maxLength: number;
546
+ requireUppercase: boolean;
547
+ requireLowercase: boolean;
548
+ requireNumber: boolean;
549
+ requireSpecialChar: boolean;
550
+ expirationDays: number;
551
+ minCharacterClasses?: number | undefined;
552
+ preventSamePassword?: boolean | undefined;
553
+ requireInitialChange?: boolean | undefined;
554
+ };
555
+ register: {
556
+ enabled: boolean;
557
+ };
558
+ login: {
559
+ password: boolean;
560
+ otp: boolean;
561
+ ldap: boolean;
562
+ email: boolean;
563
+ sms: boolean;
564
+ };
565
+ passwordReset: {
566
+ enabled: boolean;
567
+ mode: "email" | "phone";
568
+ };
569
+ otp: {
570
+ length: number;
571
+ resendInterval: number;
572
+ };
573
+ agreements: {
574
+ showOnRegister: boolean;
575
+ showOnLogin: boolean;
576
+ userAgreementMarkdown?: string | undefined;
577
+ privacyPolicyMarkdown?: string | undefined;
578
+ userAgreementUrl?: string | undefined;
579
+ privacyPolicyUrl?: string | undefined;
580
+ };
581
+ ui: {
582
+ variant: "split" | "card";
583
+ title?: string | undefined;
584
+ subtitle?: string | undefined;
585
+ brandTitle?: string | undefined;
586
+ brandText?: string | undefined;
587
+ logoUrl?: string | undefined;
588
+ illustrationUrl?: string | undefined;
589
+ };
590
+ session: {
591
+ maxAge: number;
592
+ endOnPageHide: boolean;
593
+ };
594
+ reauthentication?: {
595
+ enabled: boolean;
596
+ operations: string[];
597
+ } | undefined;
598
+ initialCredentials?: {
599
+ enabled: boolean;
600
+ } | undefined;
601
+ } | null;
602
+ } | {
603
+ success: false;
604
+ error: {
605
+ code: string | number;
606
+ message: string;
607
+ traceId?: string | undefined;
608
+ httpStatus?: number | undefined;
609
+ system?: string | undefined;
610
+ module?: string | undefined;
611
+ cause?: unknown;
612
+ suggestion?: string | undefined;
613
+ ext?: {
614
+ [x: string]: unknown;
615
+ } | undefined;
616
+ };
617
+ }, Error>;
618
+ createCaptcha: (input: Parameters<typeof client.iam.auth.createCaptcha>[0]) => _orpc_client.ClientPromiseResult<{
619
+ success: true;
620
+ data: {
621
+ id: string;
622
+ challenge: {
623
+ parameters: {
624
+ algorithm: "PBKDF2/SHA-256";
625
+ nonce: string;
626
+ salt: string;
627
+ cost: number;
628
+ keyLength: number;
629
+ keyPrefix: string;
630
+ keySignature?: string | undefined;
631
+ data?: {
632
+ [x: string]: string | number | boolean | null;
633
+ } | undefined;
634
+ };
635
+ signature?: string | undefined;
636
+ };
637
+ };
638
+ } | {
639
+ success: false;
640
+ error: {
641
+ code: string | number;
642
+ message: string;
643
+ traceId?: string | undefined;
644
+ httpStatus?: number | undefined;
645
+ system?: string | undefined;
646
+ module?: string | undefined;
647
+ cause?: unknown;
648
+ suggestion?: string | undefined;
649
+ ext?: {
650
+ [x: string]: unknown;
651
+ } | undefined;
652
+ };
653
+ }, Error>;
654
+ login: (input: IamAuthLoginInput) => Promise<HaiResult<{
655
+ user: {
656
+ id: string;
657
+ username: string;
658
+ accountStatus: "active" | "dormant" | "closed";
659
+ createdAt: string;
660
+ updatedAt: string;
661
+ email?: string | undefined;
662
+ phone?: string | undefined;
663
+ displayName?: string | undefined;
664
+ avatarUrl?: string | undefined;
665
+ accountType?: "permanent" | "temporary" | undefined;
666
+ accountExpiresAt?: string | null | undefined;
667
+ lastLoginAt?: string | null | undefined;
668
+ mustChangePassword?: boolean | undefined;
669
+ emailVerified?: boolean | undefined;
670
+ phoneVerified?: boolean | undefined;
671
+ metadata?: {
672
+ [x: string]: unknown;
673
+ } | undefined;
674
+ };
675
+ tokens: {
676
+ accessToken: string;
677
+ expiresIn: number;
678
+ tokenType: "Bearer";
679
+ refreshToken?: string | undefined;
680
+ };
681
+ roles: string[];
682
+ permissions: string[];
683
+ agreements?: {
684
+ showOnRegister: boolean;
685
+ showOnLogin: boolean;
686
+ userAgreementMarkdown?: string | undefined;
687
+ privacyPolicyMarkdown?: string | undefined;
688
+ userAgreementUrl?: string | undefined;
689
+ privacyPolicyUrl?: string | undefined;
690
+ } | undefined;
691
+ }>>;
692
+ register: (input: IamRegisterInput) => Promise<HaiResult<{
693
+ user: {
694
+ id: string;
695
+ username: string;
696
+ accountStatus: "active" | "dormant" | "closed";
697
+ createdAt: string;
698
+ updatedAt: string;
699
+ email?: string | undefined;
700
+ phone?: string | undefined;
701
+ displayName?: string | undefined;
702
+ avatarUrl?: string | undefined;
703
+ accountType?: "permanent" | "temporary" | undefined;
704
+ accountExpiresAt?: string | null | undefined;
705
+ lastLoginAt?: string | null | undefined;
706
+ mustChangePassword?: boolean | undefined;
707
+ emailVerified?: boolean | undefined;
708
+ phoneVerified?: boolean | undefined;
709
+ metadata?: {
710
+ [x: string]: unknown;
711
+ } | undefined;
712
+ };
713
+ tokens: {
714
+ accessToken: string;
715
+ expiresIn: number;
716
+ tokenType: "Bearer";
717
+ refreshToken?: string | undefined;
718
+ };
719
+ roles: string[];
720
+ permissions: string[];
721
+ agreements?: {
722
+ showOnRegister: boolean;
723
+ showOnLogin: boolean;
724
+ userAgreementMarkdown?: string | undefined;
725
+ privacyPolicyMarkdown?: string | undefined;
726
+ userAgreementUrl?: string | undefined;
727
+ privacyPolicyUrl?: string | undefined;
728
+ } | undefined;
729
+ }>>;
730
+ sendOtp: (identifier: string, options?: {
731
+ captcha?: string;
732
+ }) => _orpc_client.ClientPromiseResult<{
733
+ success: true;
734
+ data: {
735
+ expiresAt: string;
736
+ };
737
+ } | {
738
+ success: false;
739
+ error: {
740
+ code: string | number;
741
+ message: string;
742
+ traceId?: string | undefined;
743
+ httpStatus?: number | undefined;
744
+ system?: string | undefined;
745
+ module?: string | undefined;
746
+ cause?: unknown;
747
+ suggestion?: string | undefined;
748
+ ext?: {
749
+ [x: string]: unknown;
750
+ } | undefined;
751
+ };
752
+ }, Error>;
753
+ requestPasswordReset: (identifier: string, options?: {
754
+ captcha?: string;
755
+ }) => _orpc_client.ClientPromiseResult<{
756
+ success: true;
757
+ data: unknown;
758
+ } | {
759
+ success: false;
760
+ error: {
761
+ code: string | number;
762
+ message: string;
763
+ traceId?: string | undefined;
764
+ httpStatus?: number | undefined;
765
+ system?: string | undefined;
766
+ module?: string | undefined;
767
+ cause?: unknown;
768
+ suggestion?: string | undefined;
769
+ ext?: {
770
+ [x: string]: unknown;
771
+ } | undefined;
772
+ };
773
+ }, Error>;
774
+ confirmPasswordReset: (token: string, newPassword: string) => _orpc_client.ClientPromiseResult<{
775
+ success: true;
776
+ data: unknown;
777
+ } | {
778
+ success: false;
779
+ error: {
780
+ code: string | number;
781
+ message: string;
782
+ traceId?: string | undefined;
783
+ httpStatus?: number | undefined;
784
+ system?: string | undefined;
785
+ module?: string | undefined;
786
+ cause?: unknown;
787
+ suggestion?: string | undefined;
788
+ ext?: {
789
+ [x: string]: unknown;
790
+ } | undefined;
791
+ };
792
+ }, Error>;
793
+ renewPassword: (input: {
794
+ identifier: string;
795
+ password: string;
796
+ newPassword: string;
797
+ captcha?: string;
798
+ }) => _orpc_client.ClientPromiseResult<{
799
+ success: true;
800
+ data: unknown;
801
+ } | {
802
+ success: false;
803
+ error: {
804
+ code: string | number;
805
+ message: string;
806
+ traceId?: string | undefined;
807
+ httpStatus?: number | undefined;
808
+ system?: string | undefined;
809
+ module?: string | undefined;
810
+ cause?: unknown;
811
+ suggestion?: string | undefined;
812
+ ext?: {
813
+ [x: string]: unknown;
814
+ } | undefined;
815
+ };
816
+ }, Error>;
817
+ reauthenticate: (password: string, operation: string) => _orpc_client.ClientPromiseResult<{
818
+ success: true;
819
+ data: {
820
+ ticket: string;
821
+ expiresAt: number;
822
+ };
823
+ } | {
824
+ success: false;
825
+ error: {
826
+ code: string | number;
827
+ message: string;
828
+ traceId?: string | undefined;
829
+ httpStatus?: number | undefined;
830
+ system?: string | undefined;
831
+ module?: string | undefined;
832
+ cause?: unknown;
833
+ suggestion?: string | undefined;
834
+ ext?: {
835
+ [x: string]: unknown;
836
+ } | undefined;
837
+ };
838
+ }, Error>;
839
+ };
840
+
841
+ /**
842
+ * @h-ai/api-client — Token 存储与刷新管理
295
843
  *
296
- * @returns TokenStorage 实例
844
+ * 提供两个内置 Token 存储适配器(httpOnly Cookie / 内存)和一个 Token 管理器
845
+ * (封装存储读写、自动刷新、并发去重、回调通知)。
297
846
  *
298
- * @example
847
+ * @example 浏览器 SPA
299
848
  * ```ts
300
- * import { api, createMemoryTokenStorage } from '@h-ai/api-client'
849
+ * import { apiClient } from '@h-ai/api-client'
301
850
  *
302
- * await api.init({
303
- * baseUrl: 'https://api.example.com',
304
- * auth: {
305
- * storage: createMemoryTokenStorage(),
306
- * refreshUrl: '/auth/refresh',
307
- * },
851
+ * const initialized = await apiClient.init({
852
+ * baseUrl: 'https://api.example.com/api/v1',
853
+ * auth: { storage: apiClient.tokenStorage.httpOnlyCookie() },
308
854
  * })
855
+ * if (!initialized.success) throw new Error(initialized.error.message)
856
+ * await apiClient.close()
857
+ * ```
858
+ *
859
+ * @example Node.js 测试
860
+ * ```ts
861
+ * import { apiClient } from '@h-ai/api-client'
862
+ *
863
+ * const storage = apiClient.tokenStorage.memory()
864
+ * await storage.setAccessToken('test-access')
865
+ * await storage.clear()
309
866
  * ```
867
+ *
868
+ * @module api-client-auth
310
869
  */
311
- declare function createMemoryTokenStorage(): TokenStorage;
312
870
 
313
871
  /**
314
- * @h-ai/api-client — 模块入口
872
+ * 创建仅属于本适配器实例的内存凭据存储,页面刷新或进程结束后丢失。
873
+ * SSR 应为每个请求创建客户端和存储实例,避免不同用户共享默认单例。
874
+ * 通过 client.auth 更新已绑定的存储,才能撤销旧代际刷新;直接存储写入不提供这种保证。
875
+ * @returns 两个初始为空的 Token 槽位及清理操作。
315
876
  *
316
- * 提供统一的 `api` 对象,管理 HTTP 客户端运行时状态与生命周期。
317
- * @module api-client-main
877
+ * @example
878
+ * ```ts
879
+ * import { apiClient } from '@h-ai/api-client'
880
+ * const storage = apiClient.tokenStorage.memory()
881
+ * await storage.setAccessToken('test-access')
882
+ * const saved = await storage.getAccessToken()
883
+ * await storage.clear()
884
+ * // saved 为本实例的测试值;不把 Token 写入 Web Storage。
885
+ * ```
318
886
  */
887
+ declare function createMemoryTokenStorage(): TokenStorage;
888
+ /**
889
+ * 创建浏览器使用的内存 access token 与服务端 httpOnly refresh Cookie 适配器。
890
+ * refresh getter 返回内部哨兵,setter 不修改 Cookie;clear 只清除内存 access token。
891
+ * 刷新请求使用 credentials: include;服务端须实际设置/撤销 Cookie,配置适当的 Secure、SameSite、Path 与跨域凭据策略。
892
+ * HttpOnly 限制脚本直接读取 Cookie,不能阻止已执行的恶意脚本代用户发请求;服务端仍须授权和防护 CSRF。
893
+ * @returns 独立内存 access token 与 Cookie 模式标记;不接触 localStorage。
894
+ *
895
+ * @example
896
+ * ```ts
897
+ * import { apiClient } from '@h-ai/api-client'
898
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: { storage: apiClient.tokenStorage.httpOnlyCookie() } })
899
+ * if (!initialized.success) throw new Error(initialized.error.message)
900
+ * try {
901
+ * const me = await apiClient.iam.auth.currentUser()
902
+ * if (!me.success) throw new Error(me.error.message)
903
+ * const userId = me.data.id
904
+ * }
905
+ * finally { await apiClient.close() }
906
+ * ```
907
+ */
908
+ declare function createHttpOnlyCookieTokenStorage(): TokenStorage;
319
909
 
910
+ /** Token 存储方案集合:内存 / httpOnly Cookie。 */
911
+ declare const tokenStorage: {
912
+ /** 内存存储——SSR / Node 测试或一次性会话使用。 */
913
+ readonly memory: typeof createMemoryTokenStorage;
914
+ /** httpOnly Cookie 存储——浏览器场景推荐方案。 */
915
+ readonly httpOnlyCookie: typeof createHttpOnlyCookieTokenStorage;
916
+ };
917
+ /**
918
+ * 按真实 oRPC 契约创建独立 typed client;公开调用入口为 apiClient.create(contract)。
919
+ * init 返回 HaiResult,成功后才调用 procedure;已初始化实例必须先 close 再换配置。
920
+ * procedure 将传输异常转换为 HaiResult;auth.setTokens/clear 的安全存储失败仍会拒绝 Promise。
921
+ * SSR 应为每个请求创建客户端和内存存储;不共享默认单例中的用户凭据。
922
+ * @param contract - 已定义的嵌套 oRPC contract;顶层命名不能与生命周期成员冲突。
923
+ * @returns 生命周期、认证辅助操作与契约推导出的 procedure 代理。
924
+ *
925
+ * @example
926
+ * ```ts
927
+ * import { apiClient } from '@h-ai/api-client'
928
+ * import { apiContract } from '@h-ai/api-contract'
929
+ * const client = apiClient.create(apiContract.create({ iam: apiContract.iam }))
930
+ * const initialized = await client.init({ baseUrl: 'https://api.example.com/api/v1', auth: { storage: apiClient.tokenStorage.memory() }, timeout: 10000 })
931
+ * if (!initialized.success) throw new Error(initialized.error.message)
932
+ * try {
933
+ * const result = await client.iam.auth.currentUser()
934
+ * if (!result.success) throw new Error(result.error.message)
935
+ * const userId = result.data.id
936
+ * }
937
+ * finally { await client.close() }
938
+ * ```
939
+ */
940
+ declare function createApiClient<const TContract extends AnyContractRouter>(contract: TContract): ApiClient<TContract>;
320
941
  /**
321
- * API 客户端单例
942
+ * 默认 API typed client:绑定 `iam` / `storage` / `ai` 三个领域。
322
943
  *
323
- * 使用前必须先调用 `api.init()` 初始化,传入 baseUrl 等配置信息。
324
- * 初始化后通过 `api.get`、`api.post`、`api.call` 等方法发起请求。
944
+ * 大多数应用只需 `import { apiClient }` 并调用 `apiClient.init()` 即可。
325
945
  *
326
946
  * @example
327
947
  * ```ts
328
- * import { api } from '@h-ai/api-client'
948
+ * import { apiClient } from '@h-ai/api-client'
329
949
  *
330
- * // 初始化
331
- * await api.init({
332
- * baseUrl: 'https://api.example.com/api/v1',
333
- * auth: { refreshUrl: '/auth/refresh' },
950
+ * const initialized = await apiClient.init({
951
+ * baseUrl: 'http://localhost:3000/api/v1',
952
+ * auth: { refreshPath: '/auth/refresh' },
334
953
  * })
954
+ * if (!initialized.success) throw new Error(initialized.error.message)
955
+ * try {
956
+ * const result = await apiClient.iam.auth.currentUser()
957
+ * if (!result.success) throw new Error(result.error.message)
958
+ * }
959
+ * finally { await apiClient.close() }
960
+ * ```
961
+ */
962
+ declare const defaultApiContract: _h_ai_api_contract.CreatedApiContract<{
963
+ readonly iam: {
964
+ auth: {
965
+ createCaptcha: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
966
+ operation: zod.ZodEnum<{
967
+ login: "login";
968
+ register: "register";
969
+ sendOtp: "sendOtp";
970
+ passwordReset: "passwordReset";
971
+ renewPassword: "renewPassword";
972
+ }>;
973
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
974
+ success: zod.ZodLiteral<true>;
975
+ data: zod.ZodObject<{
976
+ id: zod.ZodString;
977
+ challenge: zod.ZodObject<{
978
+ signature: zod.ZodOptional<zod.ZodString>;
979
+ parameters: zod.ZodObject<{
980
+ algorithm: zod.ZodString & zod.ZodType<"PBKDF2/SHA-256", string, zod_v4_core.$ZodTypeInternals<"PBKDF2/SHA-256", string>>;
981
+ nonce: zod.ZodString;
982
+ salt: zod.ZodString;
983
+ cost: zod.ZodNumber;
984
+ keyLength: zod.ZodNumber;
985
+ keyPrefix: zod.ZodString;
986
+ keySignature: zod.ZodOptional<zod.ZodString>;
987
+ data: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber, zod.ZodBoolean, zod.ZodNull]>>>;
988
+ }, zod_v4_core.$strip>;
989
+ }, zod_v4_core.$strip>;
990
+ }, zod_v4_core.$strip>;
991
+ }, zod_v4_core.$strip>, zod.ZodObject<{
992
+ success: zod.ZodLiteral<false>;
993
+ error: zod.ZodObject<{
994
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
995
+ message: zod.ZodString;
996
+ traceId: zod.ZodOptional<zod.ZodString>;
997
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
998
+ system: zod.ZodOptional<zod.ZodString>;
999
+ module: zod.ZodOptional<zod.ZodString>;
1000
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1001
+ suggestion: zod.ZodOptional<zod.ZodString>;
1002
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1003
+ }, zod_v4_core.$strip>;
1004
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1005
+ reauthenticate: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1006
+ password: zod.ZodString;
1007
+ operation: zod.ZodString;
1008
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1009
+ success: zod.ZodLiteral<true>;
1010
+ data: zod.ZodObject<{
1011
+ ticket: zod.ZodString;
1012
+ expiresAt: zod.ZodNumber;
1013
+ }, zod_v4_core.$strip>;
1014
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1015
+ success: zod.ZodLiteral<false>;
1016
+ error: zod.ZodObject<{
1017
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1018
+ message: zod.ZodString;
1019
+ traceId: zod.ZodOptional<zod.ZodString>;
1020
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1021
+ system: zod.ZodOptional<zod.ZodString>;
1022
+ module: zod.ZodOptional<zod.ZodString>;
1023
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1024
+ suggestion: zod.ZodOptional<zod.ZodString>;
1025
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1026
+ }, zod_v4_core.$strip>;
1027
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1028
+ publicConfig: _orpc_contract.ContractProcedureBuilderWithOutput<_orpc_contract.Schema<unknown, unknown>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1029
+ success: zod.ZodLiteral<true>;
1030
+ data: zod.ZodNullable<zod.ZodObject<{
1031
+ captcha: zod.ZodDefault<zod.ZodObject<{
1032
+ enabled: zod.ZodBoolean;
1033
+ }, zod_v4_core.$strip>>;
1034
+ reauthentication: zod.ZodOptional<zod.ZodObject<{
1035
+ enabled: zod.ZodBoolean;
1036
+ operations: zod.ZodArray<zod.ZodString>;
1037
+ }, zod_v4_core.$strip>>;
1038
+ initialCredentials: zod.ZodOptional<zod.ZodObject<{
1039
+ enabled: zod.ZodBoolean;
1040
+ }, zod_v4_core.$strip>>;
1041
+ password: zod.ZodObject<{
1042
+ minLength: zod.ZodNumber;
1043
+ maxLength: zod.ZodNumber;
1044
+ requireUppercase: zod.ZodBoolean;
1045
+ requireLowercase: zod.ZodBoolean;
1046
+ requireNumber: zod.ZodBoolean;
1047
+ requireSpecialChar: zod.ZodBoolean;
1048
+ expirationDays: zod.ZodNumber;
1049
+ minCharacterClasses: zod.ZodOptional<zod.ZodNumber>;
1050
+ preventSamePassword: zod.ZodOptional<zod.ZodBoolean>;
1051
+ requireInitialChange: zod.ZodOptional<zod.ZodBoolean>;
1052
+ }, zod_v4_core.$strip>;
1053
+ register: zod.ZodObject<{
1054
+ enabled: zod.ZodBoolean;
1055
+ }, zod_v4_core.$strip>;
1056
+ login: zod.ZodObject<{
1057
+ password: zod.ZodBoolean;
1058
+ otp: zod.ZodBoolean;
1059
+ ldap: zod.ZodBoolean;
1060
+ email: zod.ZodBoolean;
1061
+ sms: zod.ZodBoolean;
1062
+ }, zod_v4_core.$strip>;
1063
+ passwordReset: zod.ZodObject<{
1064
+ enabled: zod.ZodBoolean;
1065
+ mode: zod.ZodEnum<{
1066
+ email: "email";
1067
+ phone: "phone";
1068
+ }>;
1069
+ }, zod_v4_core.$strip>;
1070
+ otp: zod.ZodObject<{
1071
+ length: zod.ZodNumber;
1072
+ resendInterval: zod.ZodNumber;
1073
+ }, zod_v4_core.$strip>;
1074
+ agreements: zod.ZodObject<{
1075
+ userAgreementMarkdown: zod.ZodOptional<zod.ZodString>;
1076
+ privacyPolicyMarkdown: zod.ZodOptional<zod.ZodString>;
1077
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
1078
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
1079
+ showOnRegister: zod.ZodBoolean;
1080
+ showOnLogin: zod.ZodBoolean;
1081
+ }, zod_v4_core.$strip>;
1082
+ ui: zod.ZodObject<{
1083
+ variant: zod.ZodEnum<{
1084
+ split: "split";
1085
+ card: "card";
1086
+ }>;
1087
+ title: zod.ZodOptional<zod.ZodString>;
1088
+ subtitle: zod.ZodOptional<zod.ZodString>;
1089
+ brandTitle: zod.ZodOptional<zod.ZodString>;
1090
+ brandText: zod.ZodOptional<zod.ZodString>;
1091
+ logoUrl: zod.ZodOptional<zod.ZodString>;
1092
+ illustrationUrl: zod.ZodOptional<zod.ZodString>;
1093
+ }, zod_v4_core.$strip>;
1094
+ session: zod.ZodObject<{
1095
+ maxAge: zod.ZodNumber;
1096
+ endOnPageHide: zod.ZodDefault<zod.ZodBoolean>;
1097
+ }, zod_v4_core.$strip>;
1098
+ }, zod_v4_core.$strip>>;
1099
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1100
+ success: zod.ZodLiteral<false>;
1101
+ error: zod.ZodObject<{
1102
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1103
+ message: zod.ZodString;
1104
+ traceId: zod.ZodOptional<zod.ZodString>;
1105
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1106
+ system: zod.ZodOptional<zod.ZodString>;
1107
+ module: zod.ZodOptional<zod.ZodString>;
1108
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1109
+ suggestion: zod.ZodOptional<zod.ZodString>;
1110
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1111
+ }, zod_v4_core.$strip>;
1112
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1113
+ renewPassword: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1114
+ identifier: zod.ZodString;
1115
+ password: zod.ZodString;
1116
+ newPassword: zod.ZodString;
1117
+ captcha: zod.ZodOptional<zod.ZodString>;
1118
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1119
+ success: zod.ZodLiteral<true>;
1120
+ data: zod.ZodVoid;
1121
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1122
+ success: zod.ZodLiteral<false>;
1123
+ error: zod.ZodObject<{
1124
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1125
+ message: zod.ZodString;
1126
+ traceId: zod.ZodOptional<zod.ZodString>;
1127
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1128
+ system: zod.ZodOptional<zod.ZodString>;
1129
+ module: zod.ZodOptional<zod.ZodString>;
1130
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1131
+ suggestion: zod.ZodOptional<zod.ZodString>;
1132
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1133
+ }, zod_v4_core.$strip>;
1134
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1135
+ loginWithLdap: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1136
+ username: zod.ZodString;
1137
+ password: zod.ZodString;
1138
+ captcha: zod.ZodOptional<zod.ZodString>;
1139
+ expectedUserId: zod.ZodOptional<zod.ZodString>;
1140
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1141
+ success: zod.ZodLiteral<true>;
1142
+ data: zod.ZodObject<{
1143
+ user: zod.ZodObject<{
1144
+ id: zod.ZodString;
1145
+ username: zod.ZodString;
1146
+ email: zod.ZodOptional<zod.ZodString>;
1147
+ phone: zod.ZodOptional<zod.ZodString>;
1148
+ displayName: zod.ZodOptional<zod.ZodString>;
1149
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1150
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1151
+ permanent: "permanent";
1152
+ temporary: "temporary";
1153
+ }>>;
1154
+ accountStatus: zod.ZodEnum<{
1155
+ active: "active";
1156
+ dormant: "dormant";
1157
+ closed: "closed";
1158
+ }>;
1159
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1160
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1161
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1162
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1163
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1164
+ createdAt: zod.ZodCoercedDate<unknown>;
1165
+ updatedAt: zod.ZodCoercedDate<unknown>;
1166
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1167
+ }, zod_v4_core.$strip>;
1168
+ tokens: zod.ZodObject<{
1169
+ accessToken: zod.ZodString;
1170
+ refreshToken: zod.ZodOptional<zod.ZodString>;
1171
+ expiresIn: zod.ZodNumber;
1172
+ tokenType: zod.ZodLiteral<"Bearer">;
1173
+ }, zod_v4_core.$strip>;
1174
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1175
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1176
+ agreements: zod.ZodOptional<zod.ZodObject<{
1177
+ userAgreementMarkdown: zod.ZodOptional<zod.ZodString>;
1178
+ privacyPolicyMarkdown: zod.ZodOptional<zod.ZodString>;
1179
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
1180
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
1181
+ showOnRegister: zod.ZodBoolean;
1182
+ showOnLogin: zod.ZodBoolean;
1183
+ }, zod_v4_core.$strip>>;
1184
+ }, zod_v4_core.$strip>;
1185
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1186
+ success: zod.ZodLiteral<false>;
1187
+ error: zod.ZodObject<{
1188
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1189
+ message: zod.ZodString;
1190
+ traceId: zod.ZodOptional<zod.ZodString>;
1191
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1192
+ system: zod.ZodOptional<zod.ZodString>;
1193
+ module: zod.ZodOptional<zod.ZodString>;
1194
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1195
+ suggestion: zod.ZodOptional<zod.ZodString>;
1196
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1197
+ }, zod_v4_core.$strip>;
1198
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1199
+ requestPasswordReset: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1200
+ identifier: zod.ZodString;
1201
+ captcha: zod.ZodOptional<zod.ZodString>;
1202
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1203
+ success: zod.ZodLiteral<true>;
1204
+ data: zod.ZodVoid;
1205
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1206
+ success: zod.ZodLiteral<false>;
1207
+ error: zod.ZodObject<{
1208
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1209
+ message: zod.ZodString;
1210
+ traceId: zod.ZodOptional<zod.ZodString>;
1211
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1212
+ system: zod.ZodOptional<zod.ZodString>;
1213
+ module: zod.ZodOptional<zod.ZodString>;
1214
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1215
+ suggestion: zod.ZodOptional<zod.ZodString>;
1216
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1217
+ }, zod_v4_core.$strip>;
1218
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1219
+ confirmPasswordReset: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1220
+ token: zod.ZodString;
1221
+ newPassword: zod.ZodString;
1222
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1223
+ success: zod.ZodLiteral<true>;
1224
+ data: zod.ZodVoid;
1225
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1226
+ success: zod.ZodLiteral<false>;
1227
+ error: zod.ZodObject<{
1228
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1229
+ message: zod.ZodString;
1230
+ traceId: zod.ZodOptional<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
+ login: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1240
+ expectedUserId: zod.ZodOptional<zod.ZodString>;
1241
+ captcha: zod.ZodOptional<zod.ZodString>;
1242
+ identifier: zod.ZodString;
1243
+ password: zod.ZodString;
1244
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1245
+ success: zod.ZodLiteral<true>;
1246
+ data: zod.ZodObject<{
1247
+ user: zod.ZodObject<{
1248
+ id: zod.ZodString;
1249
+ username: zod.ZodString;
1250
+ email: zod.ZodOptional<zod.ZodString>;
1251
+ phone: zod.ZodOptional<zod.ZodString>;
1252
+ displayName: zod.ZodOptional<zod.ZodString>;
1253
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1254
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1255
+ permanent: "permanent";
1256
+ temporary: "temporary";
1257
+ }>>;
1258
+ accountStatus: zod.ZodEnum<{
1259
+ active: "active";
1260
+ dormant: "dormant";
1261
+ closed: "closed";
1262
+ }>;
1263
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1264
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1265
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1266
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1267
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1268
+ createdAt: zod.ZodCoercedDate<unknown>;
1269
+ updatedAt: zod.ZodCoercedDate<unknown>;
1270
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1271
+ }, zod_v4_core.$strip>;
1272
+ tokens: zod.ZodObject<{
1273
+ accessToken: zod.ZodString;
1274
+ refreshToken: zod.ZodOptional<zod.ZodString>;
1275
+ expiresIn: zod.ZodNumber;
1276
+ tokenType: zod.ZodLiteral<"Bearer">;
1277
+ }, zod_v4_core.$strip>;
1278
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1279
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1280
+ agreements: zod.ZodOptional<zod.ZodObject<{
1281
+ userAgreementMarkdown: zod.ZodOptional<zod.ZodString>;
1282
+ privacyPolicyMarkdown: zod.ZodOptional<zod.ZodString>;
1283
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
1284
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
1285
+ showOnRegister: zod.ZodBoolean;
1286
+ showOnLogin: zod.ZodBoolean;
1287
+ }, zod_v4_core.$strip>>;
1288
+ }, zod_v4_core.$strip>;
1289
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1290
+ success: zod.ZodLiteral<false>;
1291
+ error: zod.ZodObject<{
1292
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1293
+ message: zod.ZodString;
1294
+ traceId: zod.ZodOptional<zod.ZodString>;
1295
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1296
+ system: zod.ZodOptional<zod.ZodString>;
1297
+ module: zod.ZodOptional<zod.ZodString>;
1298
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1299
+ suggestion: zod.ZodOptional<zod.ZodString>;
1300
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1301
+ }, zod_v4_core.$strip>;
1302
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1303
+ loginWithOtp: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1304
+ expectedUserId: zod.ZodOptional<zod.ZodString>;
1305
+ captcha: zod.ZodOptional<zod.ZodString>;
1306
+ identifier: zod.ZodString;
1307
+ code: zod.ZodString;
1308
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1309
+ success: zod.ZodLiteral<true>;
1310
+ data: zod.ZodObject<{
1311
+ user: zod.ZodObject<{
1312
+ id: zod.ZodString;
1313
+ username: zod.ZodString;
1314
+ email: zod.ZodOptional<zod.ZodString>;
1315
+ phone: zod.ZodOptional<zod.ZodString>;
1316
+ displayName: zod.ZodOptional<zod.ZodString>;
1317
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1318
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1319
+ permanent: "permanent";
1320
+ temporary: "temporary";
1321
+ }>>;
1322
+ accountStatus: zod.ZodEnum<{
1323
+ active: "active";
1324
+ dormant: "dormant";
1325
+ closed: "closed";
1326
+ }>;
1327
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1328
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1329
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1330
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1331
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1332
+ createdAt: zod.ZodCoercedDate<unknown>;
1333
+ updatedAt: zod.ZodCoercedDate<unknown>;
1334
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1335
+ }, zod_v4_core.$strip>;
1336
+ tokens: zod.ZodObject<{
1337
+ accessToken: zod.ZodString;
1338
+ refreshToken: zod.ZodOptional<zod.ZodString>;
1339
+ expiresIn: zod.ZodNumber;
1340
+ tokenType: zod.ZodLiteral<"Bearer">;
1341
+ }, zod_v4_core.$strip>;
1342
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1343
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1344
+ agreements: zod.ZodOptional<zod.ZodObject<{
1345
+ userAgreementMarkdown: zod.ZodOptional<zod.ZodString>;
1346
+ privacyPolicyMarkdown: zod.ZodOptional<zod.ZodString>;
1347
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
1348
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
1349
+ showOnRegister: zod.ZodBoolean;
1350
+ showOnLogin: zod.ZodBoolean;
1351
+ }, zod_v4_core.$strip>>;
1352
+ }, zod_v4_core.$strip>;
1353
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1354
+ success: zod.ZodLiteral<false>;
1355
+ error: zod.ZodObject<{
1356
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1357
+ message: zod.ZodString;
1358
+ traceId: zod.ZodOptional<zod.ZodString>;
1359
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1360
+ system: zod.ZodOptional<zod.ZodString>;
1361
+ module: zod.ZodOptional<zod.ZodString>;
1362
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1363
+ suggestion: zod.ZodOptional<zod.ZodString>;
1364
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1365
+ }, zod_v4_core.$strip>;
1366
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1367
+ logout: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1368
+ accessToken: zod.ZodOptional<zod.ZodString>;
1369
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1370
+ success: zod.ZodLiteral<true>;
1371
+ data: zod.ZodVoid;
1372
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1373
+ success: zod.ZodLiteral<false>;
1374
+ error: zod.ZodObject<{
1375
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1376
+ message: zod.ZodString;
1377
+ traceId: zod.ZodOptional<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
+ closeSession: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1387
+ accessToken: zod.ZodOptional<zod.ZodString>;
1388
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1389
+ success: zod.ZodLiteral<true>;
1390
+ data: zod.ZodVoid;
1391
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1392
+ success: zod.ZodLiteral<false>;
1393
+ error: zod.ZodObject<{
1394
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1395
+ message: zod.ZodString;
1396
+ traceId: zod.ZodOptional<zod.ZodString>;
1397
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1398
+ system: zod.ZodOptional<zod.ZodString>;
1399
+ module: zod.ZodOptional<zod.ZodString>;
1400
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1401
+ suggestion: zod.ZodOptional<zod.ZodString>;
1402
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1403
+ }, zod_v4_core.$strip>;
1404
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1405
+ currentUser: _orpc_contract.ContractProcedureBuilderWithOutput<_orpc_contract.Schema<unknown, unknown>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1406
+ success: zod.ZodLiteral<true>;
1407
+ data: zod.ZodObject<{
1408
+ id: zod.ZodString;
1409
+ username: zod.ZodString;
1410
+ email: zod.ZodOptional<zod.ZodString>;
1411
+ phone: zod.ZodOptional<zod.ZodString>;
1412
+ displayName: zod.ZodOptional<zod.ZodString>;
1413
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1414
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1415
+ permanent: "permanent";
1416
+ temporary: "temporary";
1417
+ }>>;
1418
+ accountStatus: zod.ZodEnum<{
1419
+ active: "active";
1420
+ dormant: "dormant";
1421
+ closed: "closed";
1422
+ }>;
1423
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1424
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1425
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1426
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1427
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1428
+ createdAt: zod.ZodCoercedDate<unknown>;
1429
+ updatedAt: zod.ZodCoercedDate<unknown>;
1430
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1431
+ roles: zod.ZodArray<zod.ZodString>;
1432
+ permissions: zod.ZodArray<zod.ZodString>;
1433
+ }, zod_v4_core.$strip>;
1434
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1435
+ success: zod.ZodLiteral<false>;
1436
+ error: zod.ZodObject<{
1437
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1438
+ message: zod.ZodString;
1439
+ traceId: zod.ZodOptional<zod.ZodString>;
1440
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1441
+ system: zod.ZodOptional<zod.ZodString>;
1442
+ module: zod.ZodOptional<zod.ZodString>;
1443
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1444
+ suggestion: zod.ZodOptional<zod.ZodString>;
1445
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1446
+ }, zod_v4_core.$strip>;
1447
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1448
+ refresh: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1449
+ refreshToken: zod.ZodString;
1450
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1451
+ success: zod.ZodLiteral<true>;
1452
+ data: zod.ZodObject<{
1453
+ tokens: zod.ZodObject<{
1454
+ accessToken: zod.ZodString;
1455
+ refreshToken: zod.ZodOptional<zod.ZodString>;
1456
+ expiresIn: zod.ZodNumber;
1457
+ tokenType: zod.ZodLiteral<"Bearer">;
1458
+ }, zod_v4_core.$strip>;
1459
+ }, zod_v4_core.$strip>;
1460
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1461
+ success: zod.ZodLiteral<false>;
1462
+ error: zod.ZodObject<{
1463
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1464
+ message: zod.ZodString;
1465
+ traceId: zod.ZodOptional<zod.ZodString>;
1466
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1467
+ system: zod.ZodOptional<zod.ZodString>;
1468
+ module: zod.ZodOptional<zod.ZodString>;
1469
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1470
+ suggestion: zod.ZodOptional<zod.ZodString>;
1471
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1472
+ }, zod_v4_core.$strip>;
1473
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1474
+ sendOtp: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1475
+ captcha: zod.ZodOptional<zod.ZodString>;
1476
+ identifier: zod.ZodString;
1477
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1478
+ success: zod.ZodLiteral<true>;
1479
+ data: zod.ZodObject<{
1480
+ expiresAt: zod.ZodCoercedDate<unknown>;
1481
+ }, zod_v4_core.$strip>;
1482
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1483
+ success: zod.ZodLiteral<false>;
1484
+ error: zod.ZodObject<{
1485
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1486
+ message: zod.ZodString;
1487
+ traceId: zod.ZodOptional<zod.ZodString>;
1488
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1489
+ system: zod.ZodOptional<zod.ZodString>;
1490
+ module: zod.ZodOptional<zod.ZodString>;
1491
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1492
+ suggestion: zod.ZodOptional<zod.ZodString>;
1493
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1494
+ }, zod_v4_core.$strip>;
1495
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1496
+ register: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1497
+ captcha: zod.ZodOptional<zod.ZodString>;
1498
+ username: zod.ZodString;
1499
+ password: zod.ZodString;
1500
+ email: zod.ZodOptional<zod.ZodString>;
1501
+ phone: zod.ZodOptional<zod.ZodString>;
1502
+ displayName: zod.ZodOptional<zod.ZodString>;
1503
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1504
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1505
+ success: zod.ZodLiteral<true>;
1506
+ data: zod.ZodObject<{
1507
+ user: zod.ZodObject<{
1508
+ id: zod.ZodString;
1509
+ username: zod.ZodString;
1510
+ email: zod.ZodOptional<zod.ZodString>;
1511
+ phone: zod.ZodOptional<zod.ZodString>;
1512
+ displayName: zod.ZodOptional<zod.ZodString>;
1513
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1514
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1515
+ permanent: "permanent";
1516
+ temporary: "temporary";
1517
+ }>>;
1518
+ accountStatus: zod.ZodEnum<{
1519
+ active: "active";
1520
+ dormant: "dormant";
1521
+ closed: "closed";
1522
+ }>;
1523
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1524
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1525
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1526
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1527
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1528
+ createdAt: zod.ZodCoercedDate<unknown>;
1529
+ updatedAt: zod.ZodCoercedDate<unknown>;
1530
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1531
+ }, zod_v4_core.$strip>;
1532
+ tokens: zod.ZodObject<{
1533
+ accessToken: zod.ZodString;
1534
+ refreshToken: zod.ZodOptional<zod.ZodString>;
1535
+ expiresIn: zod.ZodNumber;
1536
+ tokenType: zod.ZodLiteral<"Bearer">;
1537
+ }, zod_v4_core.$strip>;
1538
+ roles: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1539
+ permissions: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
1540
+ agreements: zod.ZodOptional<zod.ZodObject<{
1541
+ userAgreementMarkdown: zod.ZodOptional<zod.ZodString>;
1542
+ privacyPolicyMarkdown: zod.ZodOptional<zod.ZodString>;
1543
+ userAgreementUrl: zod.ZodOptional<zod.ZodString>;
1544
+ privacyPolicyUrl: zod.ZodOptional<zod.ZodString>;
1545
+ showOnRegister: zod.ZodBoolean;
1546
+ showOnLogin: zod.ZodBoolean;
1547
+ }, zod_v4_core.$strip>>;
1548
+ }, zod_v4_core.$strip>;
1549
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1550
+ success: zod.ZodLiteral<false>;
1551
+ error: zod.ZodObject<{
1552
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1553
+ message: zod.ZodString;
1554
+ traceId: zod.ZodOptional<zod.ZodString>;
1555
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1556
+ system: zod.ZodOptional<zod.ZodString>;
1557
+ module: zod.ZodOptional<zod.ZodString>;
1558
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1559
+ suggestion: zod.ZodOptional<zod.ZodString>;
1560
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1561
+ }, zod_v4_core.$strip>;
1562
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1563
+ changePassword: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1564
+ oldPassword: zod.ZodString;
1565
+ newPassword: zod.ZodString;
1566
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1567
+ success: zod.ZodLiteral<true>;
1568
+ data: zod.ZodVoid;
1569
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1570
+ success: zod.ZodLiteral<false>;
1571
+ error: zod.ZodObject<{
1572
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1573
+ message: zod.ZodString;
1574
+ traceId: zod.ZodOptional<zod.ZodString>;
1575
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1576
+ system: zod.ZodOptional<zod.ZodString>;
1577
+ module: zod.ZodOptional<zod.ZodString>;
1578
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1579
+ suggestion: zod.ZodOptional<zod.ZodString>;
1580
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1581
+ }, zod_v4_core.$strip>;
1582
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1583
+ updateCurrentUser: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1584
+ username: zod.ZodOptional<zod.ZodString>;
1585
+ email: zod.ZodOptional<zod.ZodString>;
1586
+ displayName: zod.ZodOptional<zod.ZodString>;
1587
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1588
+ phone: zod.ZodOptional<zod.ZodString>;
1589
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1590
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1591
+ success: zod.ZodLiteral<true>;
1592
+ data: zod.ZodObject<{
1593
+ id: zod.ZodString;
1594
+ username: zod.ZodString;
1595
+ email: zod.ZodOptional<zod.ZodString>;
1596
+ phone: zod.ZodOptional<zod.ZodString>;
1597
+ displayName: zod.ZodOptional<zod.ZodString>;
1598
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1599
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1600
+ permanent: "permanent";
1601
+ temporary: "temporary";
1602
+ }>>;
1603
+ accountStatus: zod.ZodEnum<{
1604
+ active: "active";
1605
+ dormant: "dormant";
1606
+ closed: "closed";
1607
+ }>;
1608
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1609
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1610
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1611
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1612
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1613
+ createdAt: zod.ZodCoercedDate<unknown>;
1614
+ updatedAt: zod.ZodCoercedDate<unknown>;
1615
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1616
+ }, zod_v4_core.$strip>;
1617
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1618
+ success: zod.ZodLiteral<false>;
1619
+ error: zod.ZodObject<{
1620
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1621
+ message: zod.ZodString;
1622
+ traceId: zod.ZodOptional<zod.ZodString>;
1623
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1624
+ system: zod.ZodOptional<zod.ZodString>;
1625
+ module: zod.ZodOptional<zod.ZodString>;
1626
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1627
+ suggestion: zod.ZodOptional<zod.ZodString>;
1628
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1629
+ }, zod_v4_core.$strip>;
1630
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1631
+ };
1632
+ users: {
1633
+ invite: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1634
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1635
+ email: zod.ZodOptional<zod.ZodString>;
1636
+ username: zod.ZodString;
1637
+ phone: zod.ZodOptional<zod.ZodString>;
1638
+ displayName: zod.ZodOptional<zod.ZodString>;
1639
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1640
+ permanent: "permanent";
1641
+ temporary: "temporary";
1642
+ }>>;
1643
+ accountExpiresAt: zod.ZodOptional<zod.ZodCoercedDate<unknown>>;
1644
+ roleIds: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
1645
+ accountStatus: zod.ZodOptional<zod.ZodLiteral<"active">>;
1646
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1647
+ success: zod.ZodLiteral<true>;
1648
+ data: zod.ZodObject<{
1649
+ id: zod.ZodString;
1650
+ username: zod.ZodString;
1651
+ email: zod.ZodOptional<zod.ZodString>;
1652
+ phone: zod.ZodOptional<zod.ZodString>;
1653
+ displayName: zod.ZodOptional<zod.ZodString>;
1654
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1655
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1656
+ permanent: "permanent";
1657
+ temporary: "temporary";
1658
+ }>>;
1659
+ accountStatus: zod.ZodEnum<{
1660
+ active: "active";
1661
+ dormant: "dormant";
1662
+ closed: "closed";
1663
+ }>;
1664
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1665
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1666
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1667
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1668
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1669
+ createdAt: zod.ZodCoercedDate<unknown>;
1670
+ updatedAt: zod.ZodCoercedDate<unknown>;
1671
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1672
+ }, zod_v4_core.$strip>;
1673
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1674
+ success: zod.ZodLiteral<false>;
1675
+ error: zod.ZodObject<{
1676
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1677
+ message: zod.ZodString;
1678
+ traceId: zod.ZodOptional<zod.ZodString>;
1679
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1680
+ system: zod.ZodOptional<zod.ZodString>;
1681
+ module: zod.ZodOptional<zod.ZodString>;
1682
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1683
+ suggestion: zod.ZodOptional<zod.ZodString>;
1684
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1685
+ }, zod_v4_core.$strip>;
1686
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1687
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1688
+ page: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
1689
+ pageSize: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
1690
+ sortBy: zod.ZodOptional<zod.ZodEnum<{
1691
+ createdAt: "createdAt";
1692
+ email: "email";
1693
+ username: "username";
1694
+ displayName: "displayName";
1695
+ accountStatus: "accountStatus";
1696
+ }>>;
1697
+ sortDirection: zod.ZodOptional<zod.ZodEnum<{
1698
+ asc: "asc";
1699
+ desc: "desc";
1700
+ }>>;
1701
+ roleCode: zod.ZodOptional<zod.ZodString>;
1702
+ search: zod.ZodOptional<zod.ZodString>;
1703
+ accountStatus: zod.ZodOptional<zod.ZodEnum<{
1704
+ active: "active";
1705
+ dormant: "dormant";
1706
+ closed: "closed";
1707
+ }>>;
1708
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1709
+ success: zod.ZodLiteral<true>;
1710
+ data: zod.ZodObject<{
1711
+ items: zod.ZodArray<zod.ZodObject<{
1712
+ id: zod.ZodString;
1713
+ username: zod.ZodString;
1714
+ email: zod.ZodOptional<zod.ZodString>;
1715
+ phone: zod.ZodOptional<zod.ZodString>;
1716
+ displayName: zod.ZodOptional<zod.ZodString>;
1717
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1718
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1719
+ permanent: "permanent";
1720
+ temporary: "temporary";
1721
+ }>>;
1722
+ accountStatus: zod.ZodEnum<{
1723
+ active: "active";
1724
+ dormant: "dormant";
1725
+ closed: "closed";
1726
+ }>;
1727
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1728
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1729
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1730
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1731
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1732
+ createdAt: zod.ZodCoercedDate<unknown>;
1733
+ updatedAt: zod.ZodCoercedDate<unknown>;
1734
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1735
+ }, zod_v4_core.$strip>>;
1736
+ total: zod.ZodNumber;
1737
+ page: zod.ZodNumber;
1738
+ pageSize: zod.ZodNumber;
1739
+ }, zod_v4_core.$strip>;
1740
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1741
+ success: zod.ZodLiteral<false>;
1742
+ error: zod.ZodObject<{
1743
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1744
+ message: zod.ZodString;
1745
+ traceId: zod.ZodOptional<zod.ZodString>;
1746
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1747
+ system: zod.ZodOptional<zod.ZodString>;
1748
+ module: zod.ZodOptional<zod.ZodString>;
1749
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1750
+ suggestion: zod.ZodOptional<zod.ZodString>;
1751
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1752
+ }, zod_v4_core.$strip>;
1753
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1754
+ get: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1755
+ id: zod.ZodString;
1756
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1757
+ success: zod.ZodLiteral<true>;
1758
+ data: zod.ZodNullable<zod.ZodObject<{
1759
+ id: zod.ZodString;
1760
+ username: zod.ZodString;
1761
+ email: zod.ZodOptional<zod.ZodString>;
1762
+ phone: zod.ZodOptional<zod.ZodString>;
1763
+ displayName: zod.ZodOptional<zod.ZodString>;
1764
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1765
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1766
+ permanent: "permanent";
1767
+ temporary: "temporary";
1768
+ }>>;
1769
+ accountStatus: zod.ZodEnum<{
1770
+ active: "active";
1771
+ dormant: "dormant";
1772
+ closed: "closed";
1773
+ }>;
1774
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1775
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1776
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1777
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1778
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1779
+ createdAt: zod.ZodCoercedDate<unknown>;
1780
+ updatedAt: zod.ZodCoercedDate<unknown>;
1781
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1782
+ }, zod_v4_core.$strip>>;
1783
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1784
+ success: zod.ZodLiteral<false>;
1785
+ error: zod.ZodObject<{
1786
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1787
+ message: zod.ZodString;
1788
+ traceId: zod.ZodOptional<zod.ZodString>;
1789
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1790
+ system: zod.ZodOptional<zod.ZodString>;
1791
+ module: zod.ZodOptional<zod.ZodString>;
1792
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1793
+ suggestion: zod.ZodOptional<zod.ZodString>;
1794
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1795
+ }, zod_v4_core.$strip>;
1796
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1797
+ create: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1798
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1799
+ permanent: "permanent";
1800
+ temporary: "temporary";
1801
+ }>>;
1802
+ accountStatus: zod.ZodOptional<zod.ZodEnum<{
1803
+ active: "active";
1804
+ dormant: "dormant";
1805
+ closed: "closed";
1806
+ }>>;
1807
+ accountExpiresAt: zod.ZodOptional<zod.ZodCoercedDate<unknown>>;
1808
+ username: zod.ZodString;
1809
+ email: zod.ZodOptional<zod.ZodString>;
1810
+ phone: zod.ZodOptional<zod.ZodString>;
1811
+ password: zod.ZodString;
1812
+ displayName: zod.ZodOptional<zod.ZodString>;
1813
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1814
+ roleIds: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
1815
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1816
+ success: zod.ZodLiteral<true>;
1817
+ data: zod.ZodObject<{
1818
+ id: zod.ZodString;
1819
+ username: zod.ZodString;
1820
+ email: zod.ZodOptional<zod.ZodString>;
1821
+ phone: zod.ZodOptional<zod.ZodString>;
1822
+ displayName: zod.ZodOptional<zod.ZodString>;
1823
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1824
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1825
+ permanent: "permanent";
1826
+ temporary: "temporary";
1827
+ }>>;
1828
+ accountStatus: zod.ZodEnum<{
1829
+ active: "active";
1830
+ dormant: "dormant";
1831
+ closed: "closed";
1832
+ }>;
1833
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1834
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1835
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1836
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1837
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1838
+ createdAt: zod.ZodCoercedDate<unknown>;
1839
+ updatedAt: zod.ZodCoercedDate<unknown>;
1840
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1841
+ }, zod_v4_core.$strip>;
1842
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1843
+ success: zod.ZodLiteral<false>;
1844
+ error: zod.ZodObject<{
1845
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1846
+ message: zod.ZodString;
1847
+ traceId: zod.ZodOptional<zod.ZodString>;
1848
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1849
+ system: zod.ZodOptional<zod.ZodString>;
1850
+ module: zod.ZodOptional<zod.ZodString>;
1851
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1852
+ suggestion: zod.ZodOptional<zod.ZodString>;
1853
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1854
+ }, zod_v4_core.$strip>;
1855
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1856
+ update: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1857
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1858
+ permanent: "permanent";
1859
+ temporary: "temporary";
1860
+ }>>;
1861
+ accountStatus: zod.ZodOptional<zod.ZodEnum<{
1862
+ active: "active";
1863
+ dormant: "dormant";
1864
+ closed: "closed";
1865
+ }>>;
1866
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1867
+ id: zod.ZodString;
1868
+ username: zod.ZodOptional<zod.ZodString>;
1869
+ email: zod.ZodOptional<zod.ZodString>;
1870
+ phone: zod.ZodOptional<zod.ZodString>;
1871
+ displayName: zod.ZodOptional<zod.ZodString>;
1872
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1873
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1874
+ roleIds: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
1875
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1876
+ success: zod.ZodLiteral<true>;
1877
+ data: zod.ZodObject<{
1878
+ id: zod.ZodString;
1879
+ username: zod.ZodString;
1880
+ email: zod.ZodOptional<zod.ZodString>;
1881
+ phone: zod.ZodOptional<zod.ZodString>;
1882
+ displayName: zod.ZodOptional<zod.ZodString>;
1883
+ avatarUrl: zod.ZodOptional<zod.ZodString>;
1884
+ accountType: zod.ZodOptional<zod.ZodEnum<{
1885
+ permanent: "permanent";
1886
+ temporary: "temporary";
1887
+ }>>;
1888
+ accountStatus: zod.ZodEnum<{
1889
+ active: "active";
1890
+ dormant: "dormant";
1891
+ closed: "closed";
1892
+ }>;
1893
+ accountExpiresAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1894
+ lastLoginAt: zod.ZodOptional<zod.ZodNullable<zod.ZodCoercedDate<unknown>>>;
1895
+ mustChangePassword: zod.ZodOptional<zod.ZodBoolean>;
1896
+ emailVerified: zod.ZodOptional<zod.ZodBoolean>;
1897
+ phoneVerified: zod.ZodOptional<zod.ZodBoolean>;
1898
+ createdAt: zod.ZodCoercedDate<unknown>;
1899
+ updatedAt: zod.ZodCoercedDate<unknown>;
1900
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1901
+ }, zod_v4_core.$strip>;
1902
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1903
+ success: zod.ZodLiteral<false>;
1904
+ error: zod.ZodObject<{
1905
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1906
+ message: zod.ZodString;
1907
+ traceId: zod.ZodOptional<zod.ZodString>;
1908
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1909
+ system: zod.ZodOptional<zod.ZodString>;
1910
+ module: zod.ZodOptional<zod.ZodString>;
1911
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1912
+ suggestion: zod.ZodOptional<zod.ZodString>;
1913
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1914
+ }, zod_v4_core.$strip>;
1915
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1916
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1917
+ id: zod.ZodString;
1918
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1919
+ success: zod.ZodLiteral<true>;
1920
+ data: zod.ZodVoid;
1921
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1922
+ success: zod.ZodLiteral<false>;
1923
+ error: zod.ZodObject<{
1924
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1925
+ message: zod.ZodString;
1926
+ traceId: zod.ZodOptional<zod.ZodString>;
1927
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1928
+ system: zod.ZodOptional<zod.ZodString>;
1929
+ module: zod.ZodOptional<zod.ZodString>;
1930
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1931
+ suggestion: zod.ZodOptional<zod.ZodString>;
1932
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1933
+ }, zod_v4_core.$strip>;
1934
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1935
+ resetPassword: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1936
+ id: zod.ZodString;
1937
+ newPassword: zod.ZodString;
1938
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1939
+ success: zod.ZodLiteral<true>;
1940
+ data: zod.ZodVoid;
1941
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1942
+ success: zod.ZodLiteral<false>;
1943
+ error: zod.ZodObject<{
1944
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1945
+ message: zod.ZodString;
1946
+ traceId: zod.ZodOptional<zod.ZodString>;
1947
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1948
+ system: zod.ZodOptional<zod.ZodString>;
1949
+ module: zod.ZodOptional<zod.ZodString>;
1950
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1951
+ suggestion: zod.ZodOptional<zod.ZodString>;
1952
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1953
+ }, zod_v4_core.$strip>;
1954
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1955
+ };
1956
+ roles: {
1957
+ list: _orpc_contract.ContractProcedureBuilderWithOutput<_orpc_contract.Schema<unknown, unknown>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1958
+ success: zod.ZodLiteral<true>;
1959
+ data: zod.ZodObject<{
1960
+ items: zod.ZodArray<zod.ZodObject<{
1961
+ id: zod.ZodString;
1962
+ code: zod.ZodString;
1963
+ name: zod.ZodString;
1964
+ description: zod.ZodOptional<zod.ZodString>;
1965
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
1966
+ createdAt: zod.ZodCoercedDate<unknown>;
1967
+ updatedAt: zod.ZodCoercedDate<unknown>;
1968
+ }, zod_v4_core.$strip>>;
1969
+ total: zod.ZodNumber;
1970
+ page: zod.ZodNumber;
1971
+ pageSize: zod.ZodNumber;
1972
+ }, zod_v4_core.$strip>;
1973
+ }, zod_v4_core.$strip>, zod.ZodObject<{
1974
+ success: zod.ZodLiteral<false>;
1975
+ error: zod.ZodObject<{
1976
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
1977
+ message: zod.ZodString;
1978
+ traceId: zod.ZodOptional<zod.ZodString>;
1979
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
1980
+ system: zod.ZodOptional<zod.ZodString>;
1981
+ module: zod.ZodOptional<zod.ZodString>;
1982
+ cause: zod.ZodOptional<zod.ZodUnknown>;
1983
+ suggestion: zod.ZodOptional<zod.ZodString>;
1984
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
1985
+ }, zod_v4_core.$strip>;
1986
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
1987
+ get: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
1988
+ id: zod.ZodString;
1989
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
1990
+ success: zod.ZodLiteral<true>;
1991
+ data: zod.ZodNullable<zod.ZodObject<{
1992
+ id: zod.ZodString;
1993
+ code: zod.ZodString;
1994
+ name: zod.ZodString;
1995
+ description: zod.ZodOptional<zod.ZodString>;
1996
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
1997
+ createdAt: zod.ZodCoercedDate<unknown>;
1998
+ updatedAt: zod.ZodCoercedDate<unknown>;
1999
+ }, zod_v4_core.$strip>>;
2000
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2001
+ success: zod.ZodLiteral<false>;
2002
+ error: zod.ZodObject<{
2003
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2004
+ message: zod.ZodString;
2005
+ traceId: zod.ZodOptional<zod.ZodString>;
2006
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2007
+ system: zod.ZodOptional<zod.ZodString>;
2008
+ module: zod.ZodOptional<zod.ZodString>;
2009
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2010
+ suggestion: zod.ZodOptional<zod.ZodString>;
2011
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2012
+ }, zod_v4_core.$strip>;
2013
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2014
+ create: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2015
+ code: zod.ZodString;
2016
+ name: zod.ZodString;
2017
+ description: zod.ZodOptional<zod.ZodString>;
2018
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
2019
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2020
+ success: zod.ZodLiteral<true>;
2021
+ data: zod.ZodObject<{
2022
+ id: zod.ZodString;
2023
+ code: zod.ZodString;
2024
+ name: zod.ZodString;
2025
+ description: zod.ZodOptional<zod.ZodString>;
2026
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
2027
+ createdAt: zod.ZodCoercedDate<unknown>;
2028
+ updatedAt: zod.ZodCoercedDate<unknown>;
2029
+ }, zod_v4_core.$strip>;
2030
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2031
+ success: zod.ZodLiteral<false>;
2032
+ error: zod.ZodObject<{
2033
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2034
+ message: zod.ZodString;
2035
+ traceId: zod.ZodOptional<zod.ZodString>;
2036
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2037
+ system: zod.ZodOptional<zod.ZodString>;
2038
+ module: zod.ZodOptional<zod.ZodString>;
2039
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2040
+ suggestion: zod.ZodOptional<zod.ZodString>;
2041
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2042
+ }, zod_v4_core.$strip>;
2043
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2044
+ update: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2045
+ id: zod.ZodString;
2046
+ name: zod.ZodOptional<zod.ZodString>;
2047
+ description: zod.ZodOptional<zod.ZodString>;
2048
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2049
+ success: zod.ZodLiteral<true>;
2050
+ data: zod.ZodObject<{
2051
+ id: zod.ZodString;
2052
+ code: zod.ZodString;
2053
+ name: zod.ZodString;
2054
+ description: zod.ZodOptional<zod.ZodString>;
2055
+ isSystem: zod.ZodOptional<zod.ZodBoolean>;
2056
+ createdAt: zod.ZodCoercedDate<unknown>;
2057
+ updatedAt: zod.ZodCoercedDate<unknown>;
2058
+ }, zod_v4_core.$strip>;
2059
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2060
+ success: zod.ZodLiteral<false>;
2061
+ error: zod.ZodObject<{
2062
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2063
+ message: zod.ZodString;
2064
+ traceId: zod.ZodOptional<zod.ZodString>;
2065
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2066
+ system: zod.ZodOptional<zod.ZodString>;
2067
+ module: zod.ZodOptional<zod.ZodString>;
2068
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2069
+ suggestion: zod.ZodOptional<zod.ZodString>;
2070
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2071
+ }, zod_v4_core.$strip>;
2072
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2073
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2074
+ id: zod.ZodString;
2075
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2076
+ success: zod.ZodLiteral<true>;
2077
+ data: zod.ZodVoid;
2078
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2079
+ success: zod.ZodLiteral<false>;
2080
+ error: zod.ZodObject<{
2081
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2082
+ message: zod.ZodString;
2083
+ traceId: zod.ZodOptional<zod.ZodString>;
2084
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2085
+ system: zod.ZodOptional<zod.ZodString>;
2086
+ module: zod.ZodOptional<zod.ZodString>;
2087
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2088
+ suggestion: zod.ZodOptional<zod.ZodString>;
2089
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2090
+ }, zod_v4_core.$strip>;
2091
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2092
+ };
2093
+ permissions: {
2094
+ setSensitiveOperations: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2095
+ id: zod.ZodString;
2096
+ sensitiveOperations: zod.ZodPipe<zod.ZodOptional<zod.ZodNullable<zod.ZodArray<zod.ZodString>>>, zod.ZodTransform<string[], string[] | null | undefined>>;
2097
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2098
+ success: zod.ZodLiteral<true>;
2099
+ data: zod.ZodVoid;
2100
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2101
+ success: zod.ZodLiteral<false>;
2102
+ error: zod.ZodObject<{
2103
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2104
+ message: zod.ZodString;
2105
+ traceId: zod.ZodOptional<zod.ZodString>;
2106
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2107
+ system: zod.ZodOptional<zod.ZodString>;
2108
+ module: zod.ZodOptional<zod.ZodString>;
2109
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2110
+ suggestion: zod.ZodOptional<zod.ZodString>;
2111
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2112
+ }, zod_v4_core.$strip>;
2113
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2114
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2115
+ page: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
2116
+ pageSize: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
2117
+ search: zod.ZodOptional<zod.ZodString>;
2118
+ type: zod.ZodOptional<zod.ZodEnum<{
2119
+ menu: "menu";
2120
+ api: "api";
2121
+ button: "button";
2122
+ }>>;
2123
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2124
+ success: zod.ZodLiteral<true>;
2125
+ data: zod.ZodObject<{
2126
+ items: zod.ZodArray<zod.ZodObject<{
2127
+ sensitiveOperations: zod.ZodPipe<zod.ZodOptional<zod.ZodNullable<zod.ZodArray<zod.ZodString>>>, zod.ZodTransform<string[], string[] | null | undefined>>;
2128
+ id: zod.ZodString;
2129
+ code: zod.ZodString;
2130
+ name: zod.ZodString;
2131
+ description: zod.ZodOptional<zod.ZodString>;
2132
+ type: zod.ZodOptional<zod.ZodEnum<{
2133
+ menu: "menu";
2134
+ api: "api";
2135
+ button: "button";
2136
+ }>>;
2137
+ resource: zod.ZodOptional<zod.ZodString>;
2138
+ action: zod.ZodOptional<zod.ZodString>;
2139
+ createdAt: zod.ZodCoercedDate<unknown>;
2140
+ updatedAt: zod.ZodCoercedDate<unknown>;
2141
+ }, zod_v4_core.$strip>>;
2142
+ total: zod.ZodNumber;
2143
+ page: zod.ZodNumber;
2144
+ pageSize: zod.ZodNumber;
2145
+ }, zod_v4_core.$strip>;
2146
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2147
+ success: zod.ZodLiteral<false>;
2148
+ error: zod.ZodObject<{
2149
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2150
+ message: zod.ZodString;
2151
+ traceId: zod.ZodOptional<zod.ZodString>;
2152
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2153
+ system: zod.ZodOptional<zod.ZodString>;
2154
+ module: zod.ZodOptional<zod.ZodString>;
2155
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2156
+ suggestion: zod.ZodOptional<zod.ZodString>;
2157
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2158
+ }, zod_v4_core.$strip>;
2159
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2160
+ get: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2161
+ id: zod.ZodString;
2162
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2163
+ success: zod.ZodLiteral<true>;
2164
+ data: zod.ZodNullable<zod.ZodObject<{
2165
+ sensitiveOperations: zod.ZodPipe<zod.ZodOptional<zod.ZodNullable<zod.ZodArray<zod.ZodString>>>, zod.ZodTransform<string[], string[] | null | undefined>>;
2166
+ id: zod.ZodString;
2167
+ code: zod.ZodString;
2168
+ name: zod.ZodString;
2169
+ description: zod.ZodOptional<zod.ZodString>;
2170
+ type: zod.ZodOptional<zod.ZodEnum<{
2171
+ menu: "menu";
2172
+ api: "api";
2173
+ button: "button";
2174
+ }>>;
2175
+ resource: zod.ZodOptional<zod.ZodString>;
2176
+ action: zod.ZodOptional<zod.ZodString>;
2177
+ createdAt: zod.ZodCoercedDate<unknown>;
2178
+ updatedAt: zod.ZodCoercedDate<unknown>;
2179
+ }, zod_v4_core.$strip>>;
2180
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2181
+ success: zod.ZodLiteral<false>;
2182
+ error: zod.ZodObject<{
2183
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2184
+ message: zod.ZodString;
2185
+ traceId: zod.ZodOptional<zod.ZodString>;
2186
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2187
+ system: zod.ZodOptional<zod.ZodString>;
2188
+ module: zod.ZodOptional<zod.ZodString>;
2189
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2190
+ suggestion: zod.ZodOptional<zod.ZodString>;
2191
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2192
+ }, zod_v4_core.$strip>;
2193
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2194
+ create: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2195
+ sensitiveOperations: zod.ZodDefault<zod.ZodArray<zod.ZodString>>;
2196
+ code: zod.ZodString;
2197
+ name: zod.ZodString;
2198
+ description: zod.ZodOptional<zod.ZodString>;
2199
+ resource: zod.ZodOptional<zod.ZodString>;
2200
+ action: zod.ZodOptional<zod.ZodString>;
2201
+ type: zod.ZodOptional<zod.ZodEnum<{
2202
+ menu: "menu";
2203
+ api: "api";
2204
+ button: "button";
2205
+ }>>;
2206
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2207
+ success: zod.ZodLiteral<true>;
2208
+ data: zod.ZodObject<{
2209
+ sensitiveOperations: zod.ZodPipe<zod.ZodOptional<zod.ZodNullable<zod.ZodArray<zod.ZodString>>>, zod.ZodTransform<string[], string[] | null | undefined>>;
2210
+ id: zod.ZodString;
2211
+ code: zod.ZodString;
2212
+ name: zod.ZodString;
2213
+ description: zod.ZodOptional<zod.ZodString>;
2214
+ type: zod.ZodOptional<zod.ZodEnum<{
2215
+ menu: "menu";
2216
+ api: "api";
2217
+ button: "button";
2218
+ }>>;
2219
+ resource: zod.ZodOptional<zod.ZodString>;
2220
+ action: zod.ZodOptional<zod.ZodString>;
2221
+ createdAt: zod.ZodCoercedDate<unknown>;
2222
+ updatedAt: zod.ZodCoercedDate<unknown>;
2223
+ }, zod_v4_core.$strip>;
2224
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2225
+ success: zod.ZodLiteral<false>;
2226
+ error: zod.ZodObject<{
2227
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2228
+ message: zod.ZodString;
2229
+ traceId: zod.ZodOptional<zod.ZodString>;
2230
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2231
+ system: zod.ZodOptional<zod.ZodString>;
2232
+ module: zod.ZodOptional<zod.ZodString>;
2233
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2234
+ suggestion: zod.ZodOptional<zod.ZodString>;
2235
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2236
+ }, zod_v4_core.$strip>;
2237
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2238
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2239
+ id: zod.ZodString;
2240
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2241
+ success: zod.ZodLiteral<true>;
2242
+ data: zod.ZodVoid;
2243
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2244
+ success: zod.ZodLiteral<false>;
2245
+ error: zod.ZodObject<{
2246
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2247
+ message: zod.ZodString;
2248
+ traceId: zod.ZodOptional<zod.ZodString>;
2249
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2250
+ system: zod.ZodOptional<zod.ZodString>;
2251
+ module: zod.ZodOptional<zod.ZodString>;
2252
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2253
+ suggestion: zod.ZodOptional<zod.ZodString>;
2254
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2255
+ }, zod_v4_core.$strip>;
2256
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2257
+ };
2258
+ };
2259
+ readonly storage: {
2260
+ presignedUrls: {
2261
+ createDownload: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2262
+ key: zod.ZodString;
2263
+ expiresIn: zod.ZodOptional<zod.ZodNumber>;
2264
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2265
+ success: zod.ZodLiteral<true>;
2266
+ data: zod.ZodObject<{
2267
+ url: zod.ZodString;
2268
+ key: zod.ZodString;
2269
+ expiresAt: zod.ZodOptional<zod.ZodCoercedDate<unknown>>;
2270
+ }, zod_v4_core.$strip>;
2271
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2272
+ success: zod.ZodLiteral<false>;
2273
+ error: zod.ZodObject<{
2274
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2275
+ message: zod.ZodString;
2276
+ traceId: zod.ZodOptional<zod.ZodString>;
2277
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2278
+ system: zod.ZodOptional<zod.ZodString>;
2279
+ module: zod.ZodOptional<zod.ZodString>;
2280
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2281
+ suggestion: zod.ZodOptional<zod.ZodString>;
2282
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2283
+ }, zod_v4_core.$strip>;
2284
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2285
+ createUpload: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2286
+ key: zod.ZodString;
2287
+ contentType: zod.ZodOptional<zod.ZodString>;
2288
+ expiresIn: zod.ZodOptional<zod.ZodNumber>;
2289
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2290
+ success: zod.ZodLiteral<true>;
2291
+ data: zod.ZodObject<{
2292
+ url: zod.ZodString;
2293
+ key: zod.ZodString;
2294
+ expiresAt: zod.ZodOptional<zod.ZodCoercedDate<unknown>>;
2295
+ }, zod_v4_core.$strip>;
2296
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2297
+ success: zod.ZodLiteral<false>;
2298
+ error: zod.ZodObject<{
2299
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2300
+ message: zod.ZodString;
2301
+ traceId: zod.ZodOptional<zod.ZodString>;
2302
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2303
+ system: zod.ZodOptional<zod.ZodString>;
2304
+ module: zod.ZodOptional<zod.ZodString>;
2305
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2306
+ suggestion: zod.ZodOptional<zod.ZodString>;
2307
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2308
+ }, zod_v4_core.$strip>;
2309
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2310
+ };
2311
+ files: {
2312
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2313
+ prefix: zod.ZodOptional<zod.ZodString>;
2314
+ maxKeys: zod.ZodOptional<zod.ZodCoercedNumber<unknown>>;
2315
+ continuationToken: zod.ZodOptional<zod.ZodString>;
2316
+ delimiter: zod.ZodOptional<zod.ZodString>;
2317
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2318
+ success: zod.ZodLiteral<true>;
2319
+ data: zod.ZodObject<{
2320
+ files: zod.ZodArray<zod.ZodObject<{
2321
+ key: zod.ZodString;
2322
+ size: zod.ZodNumber;
2323
+ contentType: zod.ZodString;
2324
+ lastModified: zod.ZodCoercedDate<unknown>;
2325
+ etag: zod.ZodOptional<zod.ZodString>;
2326
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodString>>;
2327
+ }, zod_v4_core.$strip>>;
2328
+ commonPrefixes: zod.ZodArray<zod.ZodString>;
2329
+ nextContinuationToken: zod.ZodOptional<zod.ZodString>;
2330
+ isTruncated: zod.ZodBoolean;
2331
+ }, zod_v4_core.$strip>;
2332
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2333
+ success: zod.ZodLiteral<false>;
2334
+ error: zod.ZodObject<{
2335
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2336
+ message: zod.ZodString;
2337
+ traceId: zod.ZodOptional<zod.ZodString>;
2338
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2339
+ system: zod.ZodOptional<zod.ZodString>;
2340
+ module: zod.ZodOptional<zod.ZodString>;
2341
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2342
+ suggestion: zod.ZodOptional<zod.ZodString>;
2343
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2344
+ }, zod_v4_core.$strip>;
2345
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2346
+ getMetadata: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2347
+ key: zod.ZodString;
2348
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2349
+ success: zod.ZodLiteral<true>;
2350
+ data: zod.ZodObject<{
2351
+ key: zod.ZodString;
2352
+ size: zod.ZodNumber;
2353
+ contentType: zod.ZodString;
2354
+ lastModified: zod.ZodCoercedDate<unknown>;
2355
+ etag: zod.ZodOptional<zod.ZodString>;
2356
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodString>>;
2357
+ }, zod_v4_core.$strip>;
2358
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2359
+ success: zod.ZodLiteral<false>;
2360
+ error: zod.ZodObject<{
2361
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2362
+ message: zod.ZodString;
2363
+ traceId: zod.ZodOptional<zod.ZodString>;
2364
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2365
+ system: zod.ZodOptional<zod.ZodString>;
2366
+ module: zod.ZodOptional<zod.ZodString>;
2367
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2368
+ suggestion: zod.ZodOptional<zod.ZodString>;
2369
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2370
+ }, zod_v4_core.$strip>;
2371
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2372
+ delete: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2373
+ key: zod.ZodString;
2374
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2375
+ success: zod.ZodLiteral<true>;
2376
+ data: zod.ZodVoid;
2377
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2378
+ success: zod.ZodLiteral<false>;
2379
+ error: zod.ZodObject<{
2380
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2381
+ message: zod.ZodString;
2382
+ traceId: zod.ZodOptional<zod.ZodString>;
2383
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2384
+ system: zod.ZodOptional<zod.ZodString>;
2385
+ module: zod.ZodOptional<zod.ZodString>;
2386
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2387
+ suggestion: zod.ZodOptional<zod.ZodString>;
2388
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2389
+ }, zod_v4_core.$strip>;
2390
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2391
+ deleteMany: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2392
+ keys: zod.ZodArray<zod.ZodString>;
2393
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2394
+ success: zod.ZodLiteral<true>;
2395
+ data: zod.ZodObject<{
2396
+ deletedKeys: zod.ZodArray<zod.ZodString>;
2397
+ failures: zod.ZodArray<zod.ZodObject<{
2398
+ key: zod.ZodString;
2399
+ code: zod.ZodString;
2400
+ retryable: zod.ZodBoolean;
2401
+ outcome: zod.ZodEnum<{
2402
+ unknown: "unknown";
2403
+ failed: "failed";
2404
+ notAttempted: "notAttempted";
2405
+ }>;
2406
+ }, zod_v4_core.$strip>>;
2407
+ }, zod_v4_core.$strip>;
2408
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2409
+ success: zod.ZodLiteral<false>;
2410
+ error: zod.ZodObject<{
2411
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2412
+ message: zod.ZodString;
2413
+ traceId: zod.ZodOptional<zod.ZodString>;
2414
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2415
+ system: zod.ZodOptional<zod.ZodString>;
2416
+ module: zod.ZodOptional<zod.ZodString>;
2417
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2418
+ suggestion: zod.ZodOptional<zod.ZodString>;
2419
+ ext: zod.ZodOptional<zod.ZodObject<{
2420
+ deleteMany: zod.ZodOptional<zod.ZodObject<{
2421
+ deletedKeys: zod.ZodArray<zod.ZodString>;
2422
+ failures: zod.ZodArray<zod.ZodObject<{
2423
+ key: zod.ZodString;
2424
+ code: zod.ZodString;
2425
+ retryable: zod.ZodBoolean;
2426
+ outcome: zod.ZodEnum<{
2427
+ unknown: "unknown";
2428
+ failed: "failed";
2429
+ notAttempted: "notAttempted";
2430
+ }>;
2431
+ }, zod_v4_core.$strip>>;
2432
+ }, zod_v4_core.$strip>>;
2433
+ }, zod_v4_core.$catchall<zod.ZodUnknown>>>;
2434
+ }, zod_v4_core.$strip>;
2435
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2436
+ };
2437
+ };
2438
+ readonly ai: {
2439
+ chats: {
2440
+ createCompletion: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2441
+ objectId: zod.ZodOptional<zod.ZodString>;
2442
+ sessionId: zod.ZodOptional<zod.ZodString>;
2443
+ model: zod.ZodOptional<zod.ZodString>;
2444
+ messages: zod.ZodArray<zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2445
+ role: zod.ZodLiteral<"system">;
2446
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodObject<{
2447
+ type: zod.ZodLiteral<"text">;
2448
+ text: zod.ZodString;
2449
+ }, zod_v4_core.$strict>>]>;
2450
+ name: zod.ZodOptional<zod.ZodString>;
2451
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2452
+ role: zod.ZodLiteral<"user">;
2453
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
2454
+ type: zod.ZodLiteral<"text">;
2455
+ text: zod.ZodString;
2456
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2457
+ type: zod.ZodLiteral<"image_url">;
2458
+ image_url: zod.ZodObject<{
2459
+ url: zod.ZodString;
2460
+ detail: zod.ZodOptional<zod.ZodEnum<{
2461
+ auto: "auto";
2462
+ low: "low";
2463
+ high: "high";
2464
+ }>>;
2465
+ }, zod_v4_core.$strict>;
2466
+ }, zod_v4_core.$strict>]>>]>;
2467
+ name: zod.ZodOptional<zod.ZodString>;
2468
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2469
+ role: zod.ZodLiteral<"assistant">;
2470
+ content: zod.ZodOptional<zod.ZodNullable<zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodObject<{
2471
+ type: zod.ZodLiteral<"text">;
2472
+ text: zod.ZodString;
2473
+ }, zod_v4_core.$strict>>]>>>;
2474
+ name: zod.ZodOptional<zod.ZodString>;
2475
+ tool_calls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
2476
+ id: zod.ZodString;
2477
+ type: zod.ZodLiteral<"function">;
2478
+ function: zod.ZodObject<{
2479
+ name: zod.ZodString;
2480
+ arguments: zod.ZodString;
2481
+ }, zod_v4_core.$strict>;
2482
+ }, zod_v4_core.$strict>>>;
2483
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2484
+ role: zod.ZodLiteral<"tool">;
2485
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodObject<{
2486
+ type: zod.ZodLiteral<"text">;
2487
+ text: zod.ZodString;
2488
+ }, zod_v4_core.$strict>>]>;
2489
+ tool_call_id: zod.ZodString;
2490
+ }, zod_v4_core.$strict>], "role">>;
2491
+ temperature: zod.ZodOptional<zod.ZodNumber>;
2492
+ top_p: zod.ZodOptional<zod.ZodNumber>;
2493
+ max_tokens: zod.ZodOptional<zod.ZodNumber>;
2494
+ tools: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
2495
+ type: zod.ZodLiteral<"function">;
2496
+ function: zod.ZodObject<{
2497
+ name: zod.ZodString;
2498
+ description: zod.ZodOptional<zod.ZodString>;
2499
+ parameters: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodJSONSchema>>;
2500
+ strict: zod.ZodOptional<zod.ZodNullable<zod.ZodBoolean>>;
2501
+ }, zod_v4_core.$strict>;
2502
+ }, zod_v4_core.$strict>>>;
2503
+ tool_choice: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodLiteral<"auto">, zod.ZodLiteral<"none">, zod.ZodLiteral<"required">, zod.ZodObject<{
2504
+ type: zod.ZodLiteral<"function">;
2505
+ function: zod.ZodObject<{
2506
+ name: zod.ZodString;
2507
+ }, zod_v4_core.$strict>;
2508
+ }, zod_v4_core.$strict>]>>;
2509
+ }, zod_v4_core.$strict>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2510
+ success: zod.ZodLiteral<true>;
2511
+ data: zod.ZodObject<{
2512
+ id: zod.ZodString;
2513
+ object: zod.ZodLiteral<"chat.completion">;
2514
+ created: zod.ZodNumber;
2515
+ model: zod.ZodString;
2516
+ choices: zod.ZodArray<zod.ZodObject<{
2517
+ index: zod.ZodNumber;
2518
+ message: zod.ZodObject<{
2519
+ role: zod.ZodLiteral<"assistant">;
2520
+ content: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
2521
+ tool_calls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
2522
+ id: zod.ZodString;
2523
+ type: zod.ZodLiteral<"function">;
2524
+ function: zod.ZodObject<{
2525
+ name: zod.ZodString;
2526
+ arguments: zod.ZodString;
2527
+ }, zod_v4_core.$strict>;
2528
+ }, zod_v4_core.$strict>>>;
2529
+ }, zod_v4_core.$strip>;
2530
+ finish_reason: zod.ZodEnum<{
2531
+ length: "length";
2532
+ tool_calls: "tool_calls";
2533
+ stop: "stop";
2534
+ content_filter: "content_filter";
2535
+ }>;
2536
+ }, zod_v4_core.$strip>>;
2537
+ usage: zod.ZodObject<{
2538
+ prompt_tokens: zod.ZodNumber;
2539
+ completion_tokens: zod.ZodNumber;
2540
+ total_tokens: zod.ZodNumber;
2541
+ }, zod_v4_core.$strip>;
2542
+ }, zod_v4_core.$strip>;
2543
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2544
+ success: zod.ZodLiteral<false>;
2545
+ error: zod.ZodObject<{
2546
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2547
+ message: zod.ZodString;
2548
+ traceId: zod.ZodOptional<zod.ZodString>;
2549
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2550
+ system: zod.ZodOptional<zod.ZodString>;
2551
+ module: zod.ZodOptional<zod.ZodString>;
2552
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2553
+ suggestion: zod.ZodOptional<zod.ZodString>;
2554
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2555
+ }, zod_v4_core.$strip>;
2556
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2557
+ sendMessage: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2558
+ objectId: zod.ZodOptional<zod.ZodString>;
2559
+ sessionId: zod.ZodOptional<zod.ZodString>;
2560
+ message: zod.ZodString;
2561
+ systemPrompt: zod.ZodOptional<zod.ZodString>;
2562
+ model: zod.ZodOptional<zod.ZodString>;
2563
+ temperature: zod.ZodOptional<zod.ZodNumber>;
2564
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2565
+ success: zod.ZodLiteral<true>;
2566
+ data: zod.ZodObject<{
2567
+ content: zod.ZodString;
2568
+ model: zod.ZodString;
2569
+ usage: zod.ZodOptional<zod.ZodObject<{
2570
+ prompt_tokens: zod.ZodNumber;
2571
+ completion_tokens: zod.ZodNumber;
2572
+ total_tokens: zod.ZodNumber;
2573
+ }, zod_v4_core.$strip>>;
2574
+ }, zod_v4_core.$strip>;
2575
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2576
+ success: zod.ZodLiteral<false>;
2577
+ error: zod.ZodObject<{
2578
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2579
+ message: zod.ZodString;
2580
+ traceId: zod.ZodOptional<zod.ZodString>;
2581
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2582
+ system: zod.ZodOptional<zod.ZodString>;
2583
+ module: zod.ZodOptional<zod.ZodString>;
2584
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2585
+ suggestion: zod.ZodOptional<zod.ZodString>;
2586
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2587
+ }, zod_v4_core.$strip>;
2588
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2589
+ listHistory: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2590
+ objectId: zod.ZodOptional<zod.ZodString>;
2591
+ sessionId: zod.ZodString;
2592
+ limit: zod.ZodOptional<zod.ZodNumber>;
2593
+ order: zod.ZodOptional<zod.ZodEnum<{
2594
+ asc: "asc";
2595
+ desc: "desc";
2596
+ }>>;
2597
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2598
+ success: zod.ZodLiteral<true>;
2599
+ data: zod.ZodObject<{
2600
+ items: zod.ZodArray<zod.ZodObject<{
2601
+ id: zod.ZodString;
2602
+ objectId: zod.ZodString;
2603
+ sessionId: zod.ZodString;
2604
+ request: zod.ZodObject<{
2605
+ model: zod.ZodString;
2606
+ messages: zod.ZodArray<zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2607
+ role: zod.ZodLiteral<"system">;
2608
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodObject<{
2609
+ type: zod.ZodLiteral<"text">;
2610
+ text: zod.ZodString;
2611
+ }, zod_v4_core.$strict>>]>;
2612
+ name: zod.ZodOptional<zod.ZodString>;
2613
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2614
+ role: zod.ZodLiteral<"user">;
2615
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
2616
+ type: zod.ZodLiteral<"text">;
2617
+ text: zod.ZodString;
2618
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2619
+ type: zod.ZodLiteral<"image_url">;
2620
+ image_url: zod.ZodObject<{
2621
+ url: zod.ZodString;
2622
+ detail: zod.ZodOptional<zod.ZodEnum<{
2623
+ auto: "auto";
2624
+ low: "low";
2625
+ high: "high";
2626
+ }>>;
2627
+ }, zod_v4_core.$strict>;
2628
+ }, zod_v4_core.$strict>]>>]>;
2629
+ name: zod.ZodOptional<zod.ZodString>;
2630
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2631
+ role: zod.ZodLiteral<"assistant">;
2632
+ content: zod.ZodOptional<zod.ZodNullable<zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodObject<{
2633
+ type: zod.ZodLiteral<"text">;
2634
+ text: zod.ZodString;
2635
+ }, zod_v4_core.$strict>>]>>>;
2636
+ name: zod.ZodOptional<zod.ZodString>;
2637
+ tool_calls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
2638
+ id: zod.ZodString;
2639
+ type: zod.ZodLiteral<"function">;
2640
+ function: zod.ZodObject<{
2641
+ name: zod.ZodString;
2642
+ arguments: zod.ZodString;
2643
+ }, zod_v4_core.$strict>;
2644
+ }, zod_v4_core.$strict>>>;
2645
+ }, zod_v4_core.$strict>, zod.ZodObject<{
2646
+ role: zod.ZodLiteral<"tool">;
2647
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodObject<{
2648
+ type: zod.ZodLiteral<"text">;
2649
+ text: zod.ZodString;
2650
+ }, zod_v4_core.$strict>>]>;
2651
+ tool_call_id: zod.ZodString;
2652
+ }, zod_v4_core.$strict>], "role">>;
2653
+ }, zod_v4_core.$strip>;
2654
+ response: zod.ZodObject<{
2655
+ content: zod.ZodString;
2656
+ toolCalls: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
2657
+ id: zod.ZodString;
2658
+ type: zod.ZodLiteral<"function">;
2659
+ function: zod.ZodObject<{
2660
+ name: zod.ZodString;
2661
+ arguments: zod.ZodString;
2662
+ }, zod_v4_core.$strict>;
2663
+ }, zod_v4_core.$strict>>>;
2664
+ finishReason: zod.ZodString;
2665
+ usage: zod.ZodObject<{
2666
+ prompt_tokens: zod.ZodNumber;
2667
+ completion_tokens: zod.ZodNumber;
2668
+ total_tokens: zod.ZodNumber;
2669
+ }, zod_v4_core.$strip>;
2670
+ }, zod_v4_core.$strip>;
2671
+ createdAt: zod.ZodNumber;
2672
+ duration: zod.ZodNumber;
2673
+ }, zod_v4_core.$strip>>;
2674
+ }, zod_v4_core.$strip>;
2675
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2676
+ success: zod.ZodLiteral<false>;
2677
+ error: zod.ZodObject<{
2678
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2679
+ message: zod.ZodString;
2680
+ traceId: zod.ZodOptional<zod.ZodString>;
2681
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2682
+ system: zod.ZodOptional<zod.ZodString>;
2683
+ module: zod.ZodOptional<zod.ZodString>;
2684
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2685
+ suggestion: zod.ZodOptional<zod.ZodString>;
2686
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2687
+ }, zod_v4_core.$strip>;
2688
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2689
+ };
2690
+ memories: {
2691
+ recall: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2692
+ query: zod.ZodString;
2693
+ topK: zod.ZodOptional<zod.ZodNumber>;
2694
+ types: zod.ZodOptional<zod.ZodArray<zod.ZodEnum<{
2695
+ instruction: "instruction";
2696
+ fact: "fact";
2697
+ preference: "preference";
2698
+ event: "event";
2699
+ entity: "entity";
2700
+ }>>>;
2701
+ minImportance: zod.ZodOptional<zod.ZodNumber>;
2702
+ objectId: zod.ZodOptional<zod.ZodString>;
2703
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2704
+ success: zod.ZodLiteral<true>;
2705
+ data: zod.ZodObject<{
2706
+ items: zod.ZodArray<zod.ZodObject<{
2707
+ id: zod.ZodString;
2708
+ content: zod.ZodString;
2709
+ type: zod.ZodEnum<{
2710
+ instruction: "instruction";
2711
+ fact: "fact";
2712
+ preference: "preference";
2713
+ event: "event";
2714
+ entity: "entity";
2715
+ }>;
2716
+ importance: zod.ZodNumber;
2717
+ objectId: zod.ZodOptional<zod.ZodString>;
2718
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2719
+ createdAt: zod.ZodNumber;
2720
+ lastAccessedAt: zod.ZodNumber;
2721
+ accessCount: zod.ZodNumber;
2722
+ }, zod_v4_core.$strip>>;
2723
+ }, zod_v4_core.$strip>;
2724
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2725
+ success: zod.ZodLiteral<false>;
2726
+ error: zod.ZodObject<{
2727
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2728
+ message: zod.ZodString;
2729
+ traceId: zod.ZodOptional<zod.ZodString>;
2730
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2731
+ system: zod.ZodOptional<zod.ZodString>;
2732
+ module: zod.ZodOptional<zod.ZodString>;
2733
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2734
+ suggestion: zod.ZodOptional<zod.ZodString>;
2735
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2736
+ }, zod_v4_core.$strip>;
2737
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2738
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2739
+ types: zod.ZodOptional<zod.ZodArray<zod.ZodEnum<{
2740
+ instruction: "instruction";
2741
+ fact: "fact";
2742
+ preference: "preference";
2743
+ event: "event";
2744
+ entity: "entity";
2745
+ }>>>;
2746
+ objectId: zod.ZodOptional<zod.ZodString>;
2747
+ offset: zod.ZodOptional<zod.ZodNumber>;
2748
+ limit: zod.ZodOptional<zod.ZodNumber>;
2749
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2750
+ success: zod.ZodLiteral<true>;
2751
+ data: zod.ZodObject<{
2752
+ items: zod.ZodArray<zod.ZodObject<{
2753
+ id: zod.ZodString;
2754
+ content: zod.ZodString;
2755
+ type: zod.ZodEnum<{
2756
+ instruction: "instruction";
2757
+ fact: "fact";
2758
+ preference: "preference";
2759
+ event: "event";
2760
+ entity: "entity";
2761
+ }>;
2762
+ importance: zod.ZodNumber;
2763
+ objectId: zod.ZodOptional<zod.ZodString>;
2764
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2765
+ createdAt: zod.ZodNumber;
2766
+ lastAccessedAt: zod.ZodNumber;
2767
+ accessCount: zod.ZodNumber;
2768
+ }, zod_v4_core.$strip>>;
2769
+ total: zod.ZodNumber;
2770
+ }, zod_v4_core.$strip>;
2771
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2772
+ success: zod.ZodLiteral<false>;
2773
+ error: zod.ZodObject<{
2774
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2775
+ message: zod.ZodString;
2776
+ traceId: zod.ZodOptional<zod.ZodString>;
2777
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2778
+ system: zod.ZodOptional<zod.ZodString>;
2779
+ module: zod.ZodOptional<zod.ZodString>;
2780
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2781
+ suggestion: zod.ZodOptional<zod.ZodString>;
2782
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2783
+ }, zod_v4_core.$strip>;
2784
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2785
+ };
2786
+ sessions: {
2787
+ list: _orpc_contract.ContractProcedureBuilderWithInputOutput<zod.ZodObject<{
2788
+ objectId: zod.ZodOptional<zod.ZodString>;
2789
+ }, zod_v4_core.$strip>, zod.ZodDiscriminatedUnion<[zod.ZodObject<{
2790
+ success: zod.ZodLiteral<true>;
2791
+ data: zod.ZodObject<{
2792
+ items: zod.ZodArray<zod.ZodObject<{
2793
+ objectId: zod.ZodString;
2794
+ sessionId: zod.ZodString;
2795
+ createdAt: zod.ZodNumber;
2796
+ updatedAt: zod.ZodNumber;
2797
+ metadata: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2798
+ }, zod_v4_core.$strip>>;
2799
+ }, zod_v4_core.$strip>;
2800
+ }, zod_v4_core.$strip>, zod.ZodObject<{
2801
+ success: zod.ZodLiteral<false>;
2802
+ error: zod.ZodObject<{
2803
+ code: zod.ZodUnion<readonly [zod.ZodString, zod.ZodNumber]>;
2804
+ message: zod.ZodString;
2805
+ traceId: zod.ZodOptional<zod.ZodString>;
2806
+ httpStatus: zod.ZodOptional<zod.ZodNumber>;
2807
+ system: zod.ZodOptional<zod.ZodString>;
2808
+ module: zod.ZodOptional<zod.ZodString>;
2809
+ cause: zod.ZodOptional<zod.ZodUnknown>;
2810
+ suggestion: zod.ZodOptional<zod.ZodString>;
2811
+ ext: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnknown>>;
2812
+ }, zod_v4_core.$strip>;
2813
+ }, zod_v4_core.$strip>], "success">, Record<never, never>, Record<never, never>>;
2814
+ };
2815
+ };
2816
+ }>;
2817
+ /**
2818
+ * 默认 iam/storage/ai typed client 与 create、tokenStorage、createAuthActions 命名空间的交叉类型。
2819
+ * 具体项目契约使用 apiClient.create 的返回类型,不给默认单例附加未知 procedure。
335
2820
  *
336
- * // 契约调用
337
- * const result = await api.call(loginEndpoint, { identifier: 'alice', password: 'xxx' })
338
- *
339
- * // 通用 HTTP
340
- * const users = await api.get<User[]>('/users', { page: 1 })
2821
+ * @example
2822
+ * ```ts
2823
+ * import { apiClient, type DefaultApiClient } from '@h-ai/api-client'
2824
+ * const client: DefaultApiClient = apiClient
2825
+ * const initialized = await client.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
2826
+ * if (!initialized.success) throw new Error(initialized.error.message)
2827
+ * try { const actions = client.createAuthActions(client); const result = await actions.publicConfig(); if (!result.success) throw new Error(result.error.message) }
2828
+ * finally { await client.close() }
2829
+ * ```
2830
+ */
2831
+ type DefaultApiClient = ApiClient<typeof defaultApiContract> & {
2832
+ readonly create: typeof createApiClient;
2833
+ readonly tokenStorage: typeof tokenStorage;
2834
+ readonly createAuthActions: typeof createIamAuthActions;
2835
+ };
2836
+ /**
2837
+ * API Client 公开入口:默认 iam/storage/ai 单例,以及独立实例、安全存储和认证动作工厂。
2838
+ * 未启用 auth 时不注入或刷新 Token;浏览器 auth: {} 使用 httpOnly Cookie 方案。
2839
+ * close 释放客户端运行状态/加密会话,不能替代服务端退出或 auth.clear。
341
2840
  *
342
- * // 关闭
343
- * await api.close()
2841
+ * @example
2842
+ * ```ts
2843
+ * import { apiClient } from '@h-ai/api-client'
2844
+ * const initialized = await apiClient.init({ baseUrl: 'https://api.example.com/api/v1', auth: {} })
2845
+ * if (!initialized.success) throw new Error(initialized.error.message)
2846
+ * try {
2847
+ * const result = await apiClient.iam.auth.currentUser()
2848
+ * if (!result.success) throw new Error(result.error.message)
2849
+ * const permissions = result.data.permissions
2850
+ * }
2851
+ * finally { await apiClient.close() }
344
2852
  * ```
345
2853
  */
346
- declare const api: ApiClientFunctions;
2854
+ declare const apiClient: DefaultApiClient;
347
2855
 
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 };
2856
+ export { type ApiClient, type ApiClientAuth, type ApiClientConfig, type ApiClientLifecycle, type ApiClientTransportConfig, type ApiRequestObserver, type ApiRequestRecord, type AuthConfig, type DefaultApiClient, HaiApiClientError, type IamAuthLoginInput, type TokenPair, type TokenStorage, apiClient };