@h-ai/api-contract 0.1.0-alpha.72 → 0.1.0-alpha.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -125,6 +125,8 @@ Object keys are limited to 1024 UTF-8 bytes and reject absolute paths, backslash
125
125
 
126
126
  ## Feedback domain contract
127
127
 
128
+ `FeedbackJob.type` and `FeedbackRetryInput.target` support independent `webhook` jobs. Details expose status, attempts and safe error codes in jobs. Business collectors and callback settings belong to trusted server initialization, not HTTP input. Read text and ZIP/GZIP through existing APIs; see [feedback](../feedback/README.en.md).
129
+
128
130
  `apiContract.feedback` exposes reports.submit/list/get/getEvidence/setStatus/retry/export/getExport/appendEvidence/completeCollection and attachments.upload/get. A minimal submission needs only submissionId/appId, without a description or exception. Client inputs cannot supply identities, permissions, S3 keys, or email recipients. `@h-ai/api-contract/feedback` provides the same schemas and types through an optional subpath.
129
131
 
130
132
  Evidence append returns acknowledged/evidenceRevision; clients release only acknowledged blocks. setStatus requires expectedVersion. export pins the evidence revision, and getExport reads the completed bundle. Base64 attachments are limited to 5 MiB of original data; the server must still verify bytes, type, and SHA-256. Report.appVersion is the application version; Report.version is the concurrency counter.
@@ -137,6 +139,16 @@ const contract = apiContract.create({ feedback: apiContract.feedback })
137
139
  const path = apiContract.pathOf(contract.feedback.reports.submit)
138
140
  ```
139
141
 
142
+ ## Optional interactive challenges
143
+
144
+ IamCreateCaptchaInputSchema/IamCaptchaChallengeSchema define POST /auth/captcha purposes and public challenges. Interactive inputs accept optional captcha up to4096 characters; public configuration exposes only enabled, defaulting false. Schemas validate structure; IAM enforces expiry, purpose and one-use consumption server-side.
145
+
146
+ See policy, defaults and recovery boundaries in [IAM](../iam/README.en.md).
147
+
148
+ ## Page exit session policy
149
+
150
+ `session.endOnPageHide` defaults to `false`. Hosts call `actions.bindPageExit({ enabled: config.session.endOnPageHide })` and invoke its returned cleanup on unmount; standard admin/H5/fullstack templates already bind it. A non-BFCache `pagehide` (including reload and full document navigation) makes a best effort POST to `/auth/session/close`, revoking the held access and related refresh through the existing CSRF/encrypted transport with `keepalive` and no automatic refresh. This response does not clear cookies/local credentials, avoiding a late old response overwriting a new login. Explicit logout still revokes and clears current credentials normally. Browsers may omit page exit requests; configure server `idleTimeout`/`absoluteTimeout` as appropriate. Immediate revocation on browser close is not guaranteed.
151
+
140
152
  ## Development and testing
141
153
 
142
154
  ```bash
package/README.ja.md CHANGED
@@ -125,6 +125,8 @@ Contract は入出力構造のみを定義します。業務エラーは procedu
125
125
 
126
126
  ## フィードバック領域の契約
127
127
 
128
+ FeedbackJob.type と FeedbackRetryInput.target は独立した webhook タスクに対応し、詳細 jobs に状態・試行回数・安全なエラーコードを含みます。業務収集関数と宛先は信頼するサーバーで設定し、HTTP 入力では指定できません。本文と ZIP/GZIP は既存 API で取得します。[feedback](../feedback/README.ja.md) を参照してください。
129
+
128
130
  `apiContract.feedback` は reports.submit/list/get/getEvidence/setStatus/retry/export/getExport/appendEvidence/completeCollection と attachments.upload/get を公開します。最小送信は submissionId/appId のみで、説明・例外は不要です。認証情報・権限・S3 key・メール受信者をクライアントから受け取りません。`@h-ai/api-contract/feedback` から同じ schema と型を個別に利用できます。
129
131
 
130
132
  証拠追加は acknowledged/evidenceRevision を返し、クライアントは確認済みの分割データのみ解放します。setStatus は expectedVersion が必要です。export は証拠改訂を固定し、getExport が完成したパッケージを読みます。base64 添付は元データ 5 MiB までとし、サーバー側で実際の容量・形式・SHA-256 を検証します。Report.appVersion はアプリ版、Report.version は同時更新制御用です。
@@ -137,6 +139,16 @@ const contract = apiContract.create({ feedback: apiContract.feedback })
137
139
  const path = apiContract.pathOf(contract.feedback.reports.submit)
138
140
  ```
139
141
 
142
+ ## 任意の対話チャレンジ
143
+
144
+ IamCreateCaptchaInputSchema/IamCaptchaChallengeSchema は POST /auth/captcha の用途と公開チャレンジを定義します。対話入力の captcha は任意で最大4096文字、公開設定は既定 false の enabled のみです。Schema は構造を検証し、期限・用途・単用消費はサーバー IAM が実行します。
145
+
146
+ 方針・既定値・復旧範囲は次を参照: [IAM](../iam/README.ja.md)。
147
+
148
+ ## ページ離脱時のセッション方針
149
+
150
+ `session.endOnPageHide` の既定値は `false` です。ホストは `actions.bindPageExit({ enabled: config.session.endOnPageHide })` を呼び、破棄時に戻り値の解除関数を実行します。標準 admin/H5/fullstack テンプレートは接続済みです。BFCache 以外の `pagehide`(再読み込み、文書全体の移動を含む)で POST `/auth/session/close` を最善努力で送信し、保持する access と関連 refresh を失効します。既存の CSRF/暗号化転送を使用し、`keepalive` を付け、自動更新しません。古い応答が新しいログインを上書きしないよう Cookie/ローカル資格情報を消去しません。明示的ログアウトは通常どおり失効と消去を行います。ブラウザーが離脱要求を送らない場合もあるため、業務に応じてサーバーの `idleTimeout`/`absoluteTimeout` を併用してください。閉じた瞬間の失効は保証できません。
151
+
140
152
  ## 開発とテスト
141
153
 
142
154
  ```bash
package/README.md CHANGED
@@ -125,6 +125,8 @@ Contract 只描述输入输出结构。业务错误由 procedure 返回 `HaiResu
125
125
 
126
126
  ## 反馈领域契约
127
127
 
128
+ `FeedbackJob.type` 与 `FeedbackRetryInput.target` 支持独立 `webhook` 任务;状态、尝试次数和安全错误码见详情 jobs。业务采集函数与回调配置仅在可信服务端注册,不接受 HTTP 输入指定。正文与 ZIP/GZIP 通过既有证据/附件接口取得,接入见 [feedback](../feedback/README.md)。
129
+
128
130
  `apiContract.feedback` 包含 reports.submit/list/get/getEvidence/setStatus/retry/export/getExport/appendEvidence/completeCollection 与 attachments.upload/get。最小提交仅需 submissionId/appId,不要求描述或异常;身份、权限、S3 key 与邮件收件人不接受客户端输入。按需通过 `@h-ai/api-contract/feedback` 导入同一组 schema 与类型。
129
131
 
130
132
  追加证据返回 acknowledged/evidenceRevision,客户端只释放已确认的块。setStatus 需要 expectedVersion;export 固定证据修订,getExport 读取已完成问题包。附件 base64 输入限制原始 5 MiB,服务端仍须验证实际字节、类型与 SHA-256。Report.appVersion 是应用版本,Report.version 是乐观锁计数。
@@ -137,6 +139,16 @@ const contract = apiContract.create({ feedback: apiContract.feedback })
137
139
  const path = apiContract.pathOf(contract.feedback.reports.submit)
138
140
  ```
139
141
 
142
+ ## 可选交互挑战
143
+
144
+ IamCreateCaptchaInputSchema / IamCaptchaChallengeSchema 定义 POST /auth/captcha 的用途与可公开挑战,交互鉴别输入允许最多4096字符的可选 captcha。IamPublicConfigSchema.captcha 仅含 enabled,缺省关闭。Schema 校验结构,证明有效期、用途和单次消费由服务端 IAM 执行。
145
+
146
+ 策略、默认值和恢复边界见 [IAM](../iam/README.md)。
147
+
148
+ ## 页面离开会话策略
149
+
150
+ `session.endOnPageHide` 默认 `false`。启用后宿主调用 `actions.bindPageExit({ enabled: config.session.endOnPageHide })` 并在卸载时调用返回的清理函数;标准 admin/H5/fullstack 模板已经接入。非 BFCache 的 `pagehide`(也包括刷新、整页导航)通过 POST `/auth/session/close` 尽力撤销当前 access 及关联 refresh,沿用 CSRF/传输加密,使用 `keepalive` 且不自动刷新会话。该响应不清 Cookie/本地凭据,避免旧响应覆盖下一次登录。显式退出仍使用正常 logout,可靠撤销并清理当前凭据。浏览器可能不发送页面离开请求,因此必须按业务配合服务端 `idleTimeout`/`absoluteTimeout`;不能据此保证关闭即撤销。
151
+
140
152
  ## 开发测试
141
153
 
142
154
  ```bash
@@ -119,13 +119,13 @@ var FeedbackSetStatusInputSchema = z.strictObject({ id, status: FeedbackStatusSc
119
119
  var FeedbackAppendEvidenceInputSchema = z.strictObject({ id, evidence: z.array(FeedbackEvidenceInputSchema).max(1e3) });
120
120
  var FeedbackEvidenceAckSchema = z.object({ acknowledged: z.array(id), evidenceRevision: z.number().int().min(1) });
121
121
  var FeedbackCompleteInputSchema = z.strictObject({ id, missing: z.array(z.string().max(2e3)).max(100).optional() });
122
- var FeedbackRetryInputSchema = z.strictObject({ id, target: z.enum(["collect", "notify", "export", "attachment"]), targetId: z.string().max(128).optional() });
122
+ var FeedbackRetryInputSchema = z.strictObject({ id, target: z.enum(["collect", "notify", "webhook", "export", "attachment"]), targetId: z.string().max(128).optional() });
123
123
  var FeedbackExportInputSchema = z.strictObject({ id, evidenceRevision: z.number().int().min(1).optional() });
124
124
  var FeedbackExportQuerySchema = z.strictObject({ id, jobId: id });
125
125
  var FeedbackJobSchema = z.object({
126
126
  id,
127
127
  feedbackId: id,
128
- type: z.enum(["collect", "notify", "export", "cleanup"]),
128
+ type: z.enum(["collect", "notify", "webhook", "export", "cleanup"]),
129
129
  status: z.enum(["pending", "running", "succeeded", "failed"]),
130
130
  attempts: z.number().int().nonnegative(),
131
131
  createdAt: timestamp,
@@ -160,5 +160,5 @@ var feedbackContract = {
160
160
  };
161
161
 
162
162
  export { FeedbackAppendEvidenceInputSchema, FeedbackAttachmentDataSchema, FeedbackAttachmentInputSchema, FeedbackAttachmentQuerySchema, FeedbackAttachmentSchema, FeedbackBudgetSchema, FeedbackCollectionStatusSchema, FeedbackCompleteInputSchema, FeedbackDetailSchema, FeedbackEvidenceAckSchema, FeedbackEvidenceInputSchema, FeedbackEvidenceQuerySchema, FeedbackEvidenceSchema, FeedbackExportInputSchema, FeedbackExportQuerySchema, FeedbackHistorySchema, FeedbackIdInputSchema, FeedbackJobSchema, FeedbackListInputSchema, FeedbackNotificationStatusSchema, FeedbackReportSchema, FeedbackRetryInputSchema, FeedbackSetStatusInputSchema, FeedbackStatusSchema, FeedbackSubmitInputSchema, FeedbackUploadInputSchema, feedbackContract, resolveFeedbackBudget };
163
- //# sourceMappingURL=chunk-JVJJOK4X.js.map
164
- //# sourceMappingURL=chunk-JVJJOK4X.js.map
163
+ //# sourceMappingURL=chunk-FGB5O4VA.js.map
164
+ //# sourceMappingURL=chunk-FGB5O4VA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feedback/feedback-budget.ts","../src/feedback/feedback-schemas.ts","../src/feedback/feedback-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-FGB5O4VA.js","sourcesContent":["/** 反馈在采集、HTTP 和离线包之间共用的字节预算;总量按未压缩字节计算。 */\nimport { z } from 'zod'\n\nconst MiB = 1024 * 1024\n\n/**\n * 有效容量策略;只含公开上限,不暴露存储或通知配置。\n * @example\n * ```ts\n * import { FeedbackBudgetSchema, resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\n * const budget = FeedbackBudgetSchema.parse(resolveFeedbackBudget())\n * ```\n */\nexport const FeedbackBudgetSchema = z.object({\n maxTotalBytes: z.number().int().min(4 * MiB).max(40 * MiB),\n maxAttachmentBytes: z.number().int().positive().max(5 * MiB),\n maxAttachmentsBytes: z.number().int().positive(),\n maxAttachmentCount: z.number().int().min(1).max(20),\n maxEvidenceBytes: z.number().int().positive().max(4 * MiB),\n maxEvidenceCount: z.number().int().min(1).max(2000),\n maxTransportBytes: z.number().int().positive().max(64 * MiB),\n})\n\n/**\n * 由服务端公开的有效预算。\n * @example\n * ```ts\n * import { type FeedbackBudget, resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\n * const budget: FeedbackBudget = resolveFeedbackBudget()\n * ```\n */\nexport type FeedbackBudget = z.infer<typeof FeedbackBudgetSchema>\n\n/**\n * 配置一次总容量,派生附件、双份证据和 JSON/Base64 传输上限;更小的旧单项限制仍生效。\n * @example\n * ```ts\n * import { resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\n * const budget = resolveFeedbackBudget({ maxTotalBytes: 16 * 1024 * 1024 })\n * ```\n */\nexport function resolveFeedbackBudget(input: { maxTotalBytes?: number, maxAttachmentBytes?: number, maxEvidenceBytes?: number, maxEvidenceCount?: number } = {}): FeedbackBudget {\n const maxTotalBytes = input.maxTotalBytes ?? 32 * MiB\n const maxEvidenceBytes = Math.min(input.maxEvidenceBytes ?? 4 * MiB, Math.floor(maxTotalBytes / 8))\n // ZIP 中同时保存 timeline 和 records;另为修订字段、历史、摘要、查看器和目录预留 2 MiB。\n const maxAttachmentsBytes = maxTotalBytes - 2 * maxEvidenceBytes - 2 * MiB\n return FeedbackBudgetSchema.parse({ maxTotalBytes, maxEvidenceBytes, maxAttachmentsBytes, maxAttachmentBytes: Math.min(input.maxAttachmentBytes ?? 5 * MiB, maxAttachmentsBytes), maxAttachmentCount: 20, maxEvidenceCount: Math.min(input.maxEvidenceCount ?? 2000, 2000),\n // 包下载也经过双向加密;不是仅按单个上传附件推导。\n maxTransportBytes: 4 * Math.ceil(maxTotalBytes / 3) + 65536 })\n}\n","/**\n * @h-ai/api-contract — 反馈的跨端数据契约。\n * 身份、租户、存储 key 和通知收件人只由可信服务端确定,不接受客户端覆盖。\n */\nimport { z } from 'zod'\nimport { PaginationQuerySchema } from '../common/pagination-schemas.js'\n\nconst id = z.string().min(1).max(128)\n// 附件标识须可无损编码为 Unicode;正常代理对(如 emoji)不受限。\nconst attachmentId = id.regex(/^[^\\uD800-\\uDFFF]*$/u)\nconst timestamp = z.number().int().nonnegative().safe()\nconst jsonObject = z.record(z.string(), z.json())\n\n/**\n * 反馈处理状态。\n * @example\n * ```ts\n * import { FeedbackStatusSchema } from '@h-ai/api-contract'\n * FeedbackStatusSchema.parse('pending')\n * ```\n */\nexport const FeedbackStatusSchema = z.enum(['pending', 'handled'])\n/**\n * 材料状态。\n * @example\n * ```ts\n * import { FeedbackCollectionStatusSchema } from '@h-ai/api-contract'\n * FeedbackCollectionStatusSchema.parse('collecting')\n * ```\n */\nexport const FeedbackCollectionStatusSchema = z.enum(['collecting', 'complete', 'partial', 'failed'])\n/**\n * 通知状态,sent 仅表示邮件服务受理。\n * @example\n * ```ts\n * import { FeedbackNotificationStatusSchema } from '@h-ai/api-contract'\n * FeedbackNotificationStatusSchema.parse('pending')\n * ```\n */\nexport const FeedbackNotificationStatusSchema = z.enum(['disabled', 'pending', 'sending', 'sent', 'deferred', 'failed'])\n\n/**\n * 单条有界、JSON 可序列化的诊断证据。\n * @example\n * ```ts\n * import { FeedbackEvidenceInputSchema } from '@h-ai/api-contract'\n * FeedbackEvidenceInputSchema.parse({ id: 'event-1', source: 'browser', sequence: 1, kind: 'log', timestamp: 1, data: { message: 'Failed' } })\n * ```\n */\nexport const FeedbackEvidenceInputSchema = z.strictObject({\n id,\n source: z.string().min(1).max(128),\n sequence: z.number().int().nonnegative().safe(),\n kind: z.enum(['log', 'error', 'request', 'interaction', 'environment', 'snapshot', 'replay', 'business', 'missing']),\n timestamp,\n requestId: id.optional(),\n errorId: id.optional(),\n data: jsonObject,\n missingReason: z.string().max(2000).optional(),\n})\n/**\n * 已保存证据及所属修订。\n * @example\n * ```ts\n * import { FeedbackEvidenceSchema } from '@h-ai/api-contract'\n * FeedbackEvidenceSchema.parse({ id: 'event-1', feedbackId: 'report-1', revision: 1, source: 'browser', sequence: 1, kind: 'log', timestamp: 1, data: {} })\n * ```\n */\nexport const FeedbackEvidenceSchema = FeedbackEvidenceInputSchema.extend({ feedbackId: id, revision: z.number().int().min(1) })\n\n/**\n * 附件声明,不含可指定的 S3 key。\n * @example\n * ```ts\n * import { FeedbackAttachmentInputSchema } from '@h-ai/api-contract'\n * FeedbackAttachmentInputSchema.parse({ id: 'image-1', name: 'screen.png', contentType: 'image/png', size: 4, checksum: '0'.repeat(64) })\n * ```\n */\nexport const FeedbackAttachmentInputSchema = z.strictObject({\n id: attachmentId,\n name: z.string().min(1).max(255),\n contentType: z.string().min(1).max(128),\n size: z.number().int().min(0).max(5 * 1024 * 1024),\n checksum: z.string().regex(/^[a-f0-9]{64}$/),\n})\n/**\n * 附件的受权元数据。\n * @example\n * ```ts\n * import { FeedbackAttachmentSchema } from '@h-ai/api-contract'\n * FeedbackAttachmentSchema.parse({ id: 'image-1', feedbackId: 'report-1', name: 'screen.png', contentType: 'image/png', size: 4, checksum: '0'.repeat(64), status: 'pending' })\n * ```\n */\nexport const FeedbackAttachmentSchema = FeedbackAttachmentInputSchema.extend({\n feedbackId: id,\n status: z.enum(['pending', 'available', 'failed']),\n missingReason: z.string().max(2000).optional(),\n})\n\n/**\n * 幂等反馈提交;所有补充输入均可选。\n * @example\n * ```ts\n * import { FeedbackSubmitInputSchema } from '@h-ai/api-contract'\n * FeedbackSubmitInputSchema.parse({ submissionId: 'submit-1', appId: 'orders' })\n * ```\n */\nexport const FeedbackSubmitInputSchema = z.strictObject({\n submissionId: id,\n appId: id,\n description: z.string().max(10000).optional(),\n category: z.string().max(64).optional(),\n contact: z.string().max(320).optional(),\n url: z.string().max(2048).optional(),\n appVersion: z.string().max(128).optional(),\n buildId: z.string().max(128).optional(),\n commit: z.string().max(128).optional(),\n anchor: z.strictObject({ kind: z.enum(['error', 'feedback']), timestamp, errorId: id.optional() }).optional(),\n evidence: z.array(FeedbackEvidenceInputSchema).max(1000).optional(),\n attachments: z.array(FeedbackAttachmentInputSchema).max(20).optional(),\n})\n\n/**\n * 反馈摘要,应用版本与乐观锁 version 分开。\n * @example\n * ```ts\n * import { FeedbackReportSchema } from '@h-ai/api-contract'\n * FeedbackReportSchema.parse({ id: 'report-1', number: 'FB-1', appId: 'orders', scopeId: 'tenant-1', userId: 'user-1', status: 'pending', collectionStatus: 'collecting', notificationStatus: 'pending', createdAt: 1, updatedAt: 1, version: 1, evidenceRevision: 1 })\n * ```\n */\nexport const FeedbackReportSchema = z.object({\n id,\n number: z.string(),\n appId: id,\n scopeId: id,\n userId: id,\n status: FeedbackStatusSchema,\n collectionStatus: FeedbackCollectionStatusSchema,\n notificationStatus: FeedbackNotificationStatusSchema,\n description: z.string().optional(),\n summary: z.string().optional(),\n category: z.string().optional(),\n contact: z.string().optional(),\n url: z.string().optional(),\n appVersion: z.string().optional(),\n buildId: z.string().optional(),\n commit: z.string().optional(),\n createdAt: timestamp,\n updatedAt: timestamp,\n version: z.number().int().min(1),\n evidenceRevision: z.number().int().min(1),\n})\n\n/**\n * 列表筛选和受限分页。\n * @example\n * ```ts\n * import { FeedbackListInputSchema } from '@h-ai/api-contract'\n * FeedbackListInputSchema.parse({ page: 1, pageSize: 20 })\n * ```\n */\nexport const FeedbackListInputSchema = PaginationQuerySchema.extend({\n sortDirection: z.enum(['asc', 'desc']).optional(),\n status: FeedbackStatusSchema.optional(),\n collectionStatus: FeedbackCollectionStatusSchema.optional(),\n notificationStatus: FeedbackNotificationStatusSchema.optional(),\n appId: id.optional(),\n appVersion: z.string().max(128).optional(),\n search: z.string().max(200).optional(),\n from: z.coerce.number().int().nonnegative().safe().optional(),\n to: z.coerce.number().int().nonnegative().safe().optional(),\n}).strict()\n/**\n * 受权记录定位。\n * @example\n * ```ts\n * import { FeedbackIdInputSchema } from '@h-ai/api-contract'\n * FeedbackIdInputSchema.parse({ id: 'report-1' })\n * ```\n */\nexport const FeedbackIdInputSchema = z.strictObject({ id })\n/**\n * 证据索引查询。\n * @example\n * ```ts\n * import { FeedbackEvidenceQuerySchema } from '@h-ai/api-contract'\n * FeedbackEvidenceQuerySchema.parse({ id: 'report-1', pageSize: 20 })\n * ```\n */\nexport const FeedbackEvidenceQuerySchema = PaginationQuerySchema.extend({\n id,\n source: z.string().max(128).optional(),\n kind: FeedbackEvidenceInputSchema.shape.kind.optional(),\n requestId: id.optional(),\n errorId: id.optional(),\n from: z.coerce.number().int().nonnegative().safe().optional(),\n to: z.coerce.number().int().nonnegative().safe().optional(),\n}).strict()\n/**\n * 状态更新必须携带已读版本。\n * @example\n * ```ts\n * import { FeedbackSetStatusInputSchema } from '@h-ai/api-contract'\n * FeedbackSetStatusInputSchema.parse({ id: 'report-1', status: 'handled', expectedVersion: 1 })\n * ```\n */\nexport const FeedbackSetStatusInputSchema = z.strictObject({ id, status: FeedbackStatusSchema, expectedVersion: z.number().int().min(1), note: z.string().max(10000).optional() })\n/**\n * 提交后补采分块,服务端按来源序号幂等确认。\n * @example\n * ```ts\n * import { FeedbackAppendEvidenceInputSchema } from '@h-ai/api-contract'\n * FeedbackAppendEvidenceInputSchema.parse({ id: 'report-1', evidence: [] })\n * ```\n */\nexport const FeedbackAppendEvidenceInputSchema = z.strictObject({ id, evidence: z.array(FeedbackEvidenceInputSchema).max(1000) })\n/**\n * 已可靠入库的证据确认。\n * @example\n * ```ts\n * import { FeedbackEvidenceAckSchema } from '@h-ai/api-contract'\n * FeedbackEvidenceAckSchema.parse({ acknowledged: ['event-1'], evidenceRevision: 1 })\n * ```\n */\nexport const FeedbackEvidenceAckSchema = z.object({ acknowledged: z.array(id), evidenceRevision: z.number().int().min(1) })\n/**\n * 采集结束或部分缺失。\n * @example\n * ```ts\n * import { FeedbackCompleteInputSchema } from '@h-ai/api-contract'\n * FeedbackCompleteInputSchema.parse({ id: 'report-1', missing: [] })\n * ```\n */\nexport const FeedbackCompleteInputSchema = z.strictObject({ id, missing: z.array(z.string().max(2000)).max(100).optional() })\n/**\n * 按任务类别重试。\n * @example\n * ```ts\n * import { FeedbackRetryInputSchema } from '@h-ai/api-contract'\n * FeedbackRetryInputSchema.parse({ id: 'report-1', target: 'notify' })\n * ```\n */\nexport const FeedbackRetryInputSchema = z.strictObject({ id, target: z.enum(['collect', 'notify', 'webhook', 'export', 'attachment']), targetId: z.string().max(128).optional() })\n/**\n * 固定证据修订的导出请求。\n * @example\n * ```ts\n * import { FeedbackExportInputSchema } from '@h-ai/api-contract'\n * FeedbackExportInputSchema.parse({ id: 'report-1' })\n * ```\n */\nexport const FeedbackExportInputSchema = z.strictObject({ id, evidenceRevision: z.number().int().min(1).optional() })\n/**\n * 已生成问题包的受权下载定位。\n * @example\n * ```ts\n * import { FeedbackExportQuerySchema } from '@h-ai/api-contract'\n * FeedbackExportQuerySchema.parse({ id: 'report-1', jobId: 'job-1' })\n * ```\n */\nexport const FeedbackExportQuerySchema = z.strictObject({ id, jobId: id })\n\n/**\n * 后台任务的安全状态,不暴露邮件正文、租约和存储 key。\n * @example\n * ```ts\n * import { FeedbackJobSchema } from '@h-ai/api-contract'\n * FeedbackJobSchema.parse({ id: 'job-1', feedbackId: 'report-1', type: 'export', status: 'pending', attempts: 0, createdAt: 1, updatedAt: 1 })\n * ```\n */\nexport const FeedbackJobSchema = z.object({\n id,\n feedbackId: id,\n type: z.enum(['collect', 'notify', 'webhook', 'export', 'cleanup']),\n status: z.enum(['pending', 'running', 'succeeded', 'failed']),\n attempts: z.number().int().nonnegative(),\n createdAt: timestamp,\n updatedAt: timestamp,\n nextRunAt: timestamp.optional(),\n lastError: z.string().optional(),\n result: jsonObject.optional(),\n})\n/**\n * 处理变更历史。\n * @example\n * ```ts\n * import { FeedbackHistorySchema } from '@h-ai/api-contract'\n * FeedbackHistorySchema.parse({ id: 'history-1', feedbackId: 'report-1', userId: 'user-1', from: 'pending', to: 'handled', timestamp: 1 })\n * ```\n */\nexport const FeedbackHistorySchema = z.object({ id, feedbackId: id, userId: id, from: FeedbackStatusSchema, to: FeedbackStatusSchema, timestamp, note: z.string().optional() })\n/**\n * 详情按需加载,完整日志通过单独分页接口查询。\n * @example\n * ```ts\n * import type { FeedbackDetail } from '@h-ai/api-contract'\n * function numberOfAttachments(detail: FeedbackDetail) { return detail.attachments.length }\n * ```\n */\nexport const FeedbackDetailSchema = z.object({ report: FeedbackReportSchema, attachments: z.array(FeedbackAttachmentSchema), history: z.array(FeedbackHistorySchema), jobs: z.array(FeedbackJobSchema) })\n/**\n * 有界附件上传,解码前后均须检查长度和 checksum。\n * @example\n * ```ts\n * import { FeedbackUploadInputSchema } from '@h-ai/api-contract'\n * FeedbackUploadInputSchema.parse({ id: 'report-1', attachmentId: 'image-1', dataBase64: 'iVBORw==' })\n * ```\n */\nexport const FeedbackUploadInputSchema = z.strictObject({ id, attachmentId, dataBase64: z.string().max(4 * Math.ceil(5 * 1024 * 1024 / 3)).refine(value => value.length % 4 === 0 && /^[A-Z0-9+/]*={0,2}$/i.test(value)) })\n/**\n * 附件受权读取定位。\n * @example\n * ```ts\n * import { FeedbackAttachmentQuerySchema } from '@h-ai/api-contract'\n * FeedbackAttachmentQuerySchema.parse({ id: 'report-1', attachmentId: 'image-1' })\n * ```\n */\nexport const FeedbackAttachmentQuerySchema = z.strictObject({ id, attachmentId })\n/**\n * 受权附件内容,不暴露 S3 凭据或公网链接。\n * @example\n * ```ts\n * import { FeedbackAttachmentDataSchema } from '@h-ai/api-contract'\n * FeedbackAttachmentDataSchema.parse({ name: 'screen.png', contentType: 'image/png', dataBase64: 'iVBORw==' })\n * ```\n */\nexport const FeedbackAttachmentDataSchema = z.object({ name: z.string(), contentType: z.string(), dataBase64: z.string() })\n\n/**\n * FeedbackStatus 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackStatus } from '@h-ai/api-contract'\n * const value: FeedbackStatus = 'pending'\n * ```\n */\nexport type FeedbackStatus = z.infer<typeof FeedbackStatusSchema>\n/**\n * FeedbackCollectionStatus 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackCollectionStatus } from '@h-ai/api-contract'\n * const value: FeedbackCollectionStatus = 'collecting'\n * ```\n */\nexport type FeedbackCollectionStatus = z.infer<typeof FeedbackCollectionStatusSchema>\n/**\n * FeedbackNotificationStatus 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackNotificationStatus } from '@h-ai/api-contract'\n * const value: FeedbackNotificationStatus = 'pending'\n * ```\n */\nexport type FeedbackNotificationStatus = z.infer<typeof FeedbackNotificationStatusSchema>\n/**\n * FeedbackEvidenceInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackEvidenceInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackEvidenceInput) { return value.id }\n * ```\n */\nexport type FeedbackEvidenceInput = z.infer<typeof FeedbackEvidenceInputSchema>\n/**\n * FeedbackEvidence 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackEvidence } from '@h-ai/api-contract'\n * function inspect(value: FeedbackEvidence) { return value.id }\n * ```\n */\nexport type FeedbackEvidence = z.infer<typeof FeedbackEvidenceSchema>\n/**\n * FeedbackAttachmentInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackAttachmentInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackAttachmentInput) { return value.id }\n * ```\n */\nexport type FeedbackAttachmentInput = z.infer<typeof FeedbackAttachmentInputSchema>\n/**\n * FeedbackAttachment 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackAttachment } from '@h-ai/api-contract'\n * function inspect(value: FeedbackAttachment) { return value.id }\n * ```\n */\nexport type FeedbackAttachment = z.infer<typeof FeedbackAttachmentSchema>\n/**\n * FeedbackSubmitInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackSubmitInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackSubmitInput) { return value.submissionId }\n * ```\n */\nexport type FeedbackSubmitInput = z.infer<typeof FeedbackSubmitInputSchema>\n/**\n * FeedbackReport 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackReport } from '@h-ai/api-contract'\n * function inspect(value: FeedbackReport) { return value.id }\n * ```\n */\nexport type FeedbackReport = z.infer<typeof FeedbackReportSchema>\n/**\n * FeedbackListInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackListInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackListInput) { return value.pageSize }\n * ```\n */\nexport type FeedbackListInput = z.infer<typeof FeedbackListInputSchema>\n/**\n * FeedbackEvidenceQuery 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackEvidenceQuery } from '@h-ai/api-contract'\n * function inspect(value: FeedbackEvidenceQuery) { return value.id }\n * ```\n */\nexport type FeedbackEvidenceQuery = z.infer<typeof FeedbackEvidenceQuerySchema>\n/**\n * FeedbackSetStatusInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackSetStatusInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackSetStatusInput) { return value.id }\n * ```\n */\nexport type FeedbackSetStatusInput = z.infer<typeof FeedbackSetStatusInputSchema>\n/**\n * FeedbackAppendEvidenceInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackAppendEvidenceInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackAppendEvidenceInput) { return value.id }\n * ```\n */\nexport type FeedbackAppendEvidenceInput = z.infer<typeof FeedbackAppendEvidenceInputSchema>\n/**\n * FeedbackEvidenceAck 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackEvidenceAck } from '@h-ai/api-contract'\n * function inspect(value: FeedbackEvidenceAck) { return value.acknowledged.length }\n * ```\n */\nexport type FeedbackEvidenceAck = z.infer<typeof FeedbackEvidenceAckSchema>\n/**\n * FeedbackCompleteInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackCompleteInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackCompleteInput) { return value.id }\n * ```\n */\nexport type FeedbackCompleteInput = z.infer<typeof FeedbackCompleteInputSchema>\n/**\n * FeedbackRetryInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackRetryInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackRetryInput) { return value.id }\n * ```\n */\nexport type FeedbackRetryInput = z.infer<typeof FeedbackRetryInputSchema>\n/**\n * FeedbackExportInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackExportInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackExportInput) { return value.id }\n * ```\n */\nexport type FeedbackExportInput = z.infer<typeof FeedbackExportInputSchema>\n/**\n * FeedbackJob 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackJob } from '@h-ai/api-contract'\n * function inspect(value: FeedbackJob) { return value.id }\n * ```\n */\nexport type FeedbackJob = z.infer<typeof FeedbackJobSchema>\n/**\n * FeedbackHistory 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackHistory } from '@h-ai/api-contract'\n * function inspect(value: FeedbackHistory) { return value.id }\n * ```\n */\nexport type FeedbackHistory = z.infer<typeof FeedbackHistorySchema>\n/**\n * FeedbackDetail 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackDetail } from '@h-ai/api-contract'\n * function inspect(value: FeedbackDetail) { return value.report.number }\n * ```\n */\nexport type FeedbackDetail = z.infer<typeof FeedbackDetailSchema>\n/**\n * FeedbackUploadInput 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackUploadInput } from '@h-ai/api-contract'\n * function inspect(value: FeedbackUploadInput) { return value.id }\n * ```\n */\nexport type FeedbackUploadInput = z.infer<typeof FeedbackUploadInputSchema>\n/**\n * FeedbackAttachmentData 的共享类型,由对应 schema 推导。\n * @example\n * ```ts\n * import type { FeedbackAttachmentData } from '@h-ai/api-contract'\n * function inspect(value: FeedbackAttachmentData) { return value.contentType }\n * ```\n */\nexport type FeedbackAttachmentData = z.infer<typeof FeedbackAttachmentDataSchema>\n","import { z } from 'zod'\n/** @h-ai/api-contract — 反馈的受权 HTTP 契约。 */\nimport { paginatedSchema } from '../common/pagination-schemas.js'\nimport { haiResultSchema, HaiVoidResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport { FeedbackBudgetSchema } from './feedback-budget.js'\nimport {\n FeedbackAppendEvidenceInputSchema,\n FeedbackAttachmentDataSchema,\n FeedbackAttachmentQuerySchema,\n FeedbackAttachmentSchema,\n FeedbackCompleteInputSchema,\n FeedbackDetailSchema,\n FeedbackEvidenceAckSchema,\n FeedbackEvidenceQuerySchema,\n FeedbackEvidenceSchema,\n FeedbackExportInputSchema,\n FeedbackExportQuerySchema,\n FeedbackIdInputSchema,\n FeedbackJobSchema,\n FeedbackListInputSchema,\n FeedbackReportSchema,\n FeedbackRetryInputSchema,\n FeedbackSetStatusInputSchema,\n FeedbackSubmitInputSchema,\n FeedbackUploadInputSchema,\n} from './feedback-schemas.js'\n\n/**\n * 反馈契约,宿主自行决定是否挂载。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n * const contract = apiContract.create({ feedback: apiContract.feedback })\n * const path = apiContract.pathOf(contract.feedback.reports.submit)\n * ```\n */\nexport const feedbackContract = {\n reports: {\n policy: route({ method: 'GET', path: '/feedback/policy', operationId: 'feedback.reports.policy', summary: 'Effective feedback capacity', tags: ['feedback'] })\n .input(z.object({}))\n .output(haiResultSchema(FeedbackBudgetSchema)),\n submit: route({ method: 'POST', path: '/feedback/reports', operationId: 'feedback.reports.submit', summary: 'submit feedback', tags: ['feedback'] })\n .input(FeedbackSubmitInputSchema)\n .output(haiResultSchema(FeedbackReportSchema)),\n list: route({ method: 'GET', path: '/feedback/reports', operationId: 'feedback.reports.list', summary: 'list feedback', tags: ['feedback'] })\n .input(FeedbackListInputSchema)\n .output(haiResultSchema(paginatedSchema(FeedbackReportSchema))),\n get: route({ method: 'GET', path: '/feedback/reports/{id}', operationId: 'feedback.reports.get', summary: 'get feedback', tags: ['feedback'] })\n .input(FeedbackIdInputSchema)\n .output(haiResultSchema(FeedbackDetailSchema)),\n getEvidence: route({ method: 'GET', path: '/feedback/reports/{id}/evidence', operationId: 'feedback.reports.getEvidence', summary: 'getEvidence feedback', tags: ['feedback'] })\n .input(FeedbackEvidenceQuerySchema)\n .output(haiResultSchema(paginatedSchema(FeedbackEvidenceSchema))),\n setStatus: route({ method: 'PATCH', path: '/feedback/reports/{id}/status', operationId: 'feedback.reports.setStatus', summary: 'setStatus feedback', tags: ['feedback'] })\n .input(FeedbackSetStatusInputSchema)\n .output(haiResultSchema(FeedbackReportSchema)),\n retry: route({ method: 'POST', path: '/feedback/reports/{id}/retry', operationId: 'feedback.reports.retry', summary: 'retry feedback', tags: ['feedback'] })\n .input(FeedbackRetryInputSchema)\n .output(HaiVoidResultSchema),\n export: route({ method: 'POST', path: '/feedback/reports/{id}/exports', operationId: 'feedback.reports.export', summary: 'export feedback', tags: ['feedback'] })\n .input(FeedbackExportInputSchema)\n .output(haiResultSchema(FeedbackJobSchema)),\n appendEvidence: route({ method: 'POST', path: '/feedback/reports/{id}/evidence', operationId: 'feedback.reports.appendEvidence', summary: 'appendEvidence feedback', tags: ['feedback'] })\n .input(FeedbackAppendEvidenceInputSchema)\n .output(haiResultSchema(FeedbackEvidenceAckSchema)),\n getExport: route({ method: 'GET', path: '/feedback/reports/{id}/exports/{jobId}', operationId: 'feedback.reports.getExport', summary: 'Download feedback export', tags: ['feedback'] })\n .input(FeedbackExportQuerySchema)\n .output(haiResultSchema(FeedbackAttachmentDataSchema)),\n completeCollection: route({ method: 'POST', path: '/feedback/reports/{id}/complete', operationId: 'feedback.reports.completeCollection', summary: 'completeCollection feedback', tags: ['feedback'] })\n .input(FeedbackCompleteInputSchema)\n .output(haiResultSchema(FeedbackReportSchema)),\n },\n attachments: {\n upload: route({ method: 'POST', path: '/feedback/reports/{id}/attachments/{attachmentId}', operationId: 'feedback.attachments.upload', summary: 'Upload feedback attachment', tags: ['feedback'] })\n .input(FeedbackUploadInputSchema)\n .output(haiResultSchema(FeedbackAttachmentSchema)),\n get: route({ method: 'GET', path: '/feedback/reports/{id}/attachments/{attachmentId}', operationId: 'feedback.attachments.get', summary: 'Read feedback attachment', tags: ['feedback'] })\n .input(FeedbackAttachmentQuerySchema)\n .output(haiResultSchema(FeedbackAttachmentDataSchema)),\n },\n}\n\n/**\n * 反馈 typed client 的契约类型。\n * @example\n * ```ts\n * import type { FeedbackContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n * const contract: FeedbackContract = apiContract.feedback\n * ```\n */\nexport type FeedbackContract = typeof feedbackContract\n"]}
@@ -2,6 +2,24 @@ import { PaginationQuerySchema, paginatedSchema } from './chunk-CCCPHO6X.js';
2
2
  import { haiResultSchema, route, HaiVoidResultSchema } from './chunk-5UEDYQLG.js';
3
3
  import { z } from 'zod';
4
4
 
5
+ var captchaProofSchema = z.string().min(1).max(4096).optional();
6
+ var IamCreateCaptchaInputSchema = z.object({ operation: z.enum(["login", "register", "sendOtp", "passwordReset", "renewPassword"]) });
7
+ var IamCaptchaChallengeSchema = z.object({
8
+ id: z.string().regex(/^[a-f0-9]{64}$/),
9
+ challenge: z.object({
10
+ signature: z.string().max(256).optional(),
11
+ parameters: z.object({
12
+ algorithm: z.string().refine((value) => value === "PBKDF2/SHA-256"),
13
+ nonce: z.string().min(1).max(256),
14
+ salt: z.string().min(1).max(256),
15
+ cost: z.number().int().min(100).max(5e4),
16
+ keyLength: z.number().int().min(16).max(64),
17
+ keyPrefix: z.string().min(1).max(128),
18
+ keySignature: z.string().max(256).optional(),
19
+ data: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional()
20
+ })
21
+ })
22
+ });
5
23
  var IamUserSchema = z.object({
6
24
  id: z.string(),
7
25
  username: z.string(),
@@ -10,6 +28,11 @@ var IamUserSchema = z.object({
10
28
  displayName: z.string().optional(),
11
29
  avatarUrl: z.string().optional(),
12
30
  enabled: z.boolean(),
31
+ accountType: z.enum(["permanent", "temporary"]).optional(),
32
+ accountStatus: z.enum(["active", "dormant", "closed"]).optional(),
33
+ accountExpiresAt: z.coerce.date().nullable().optional(),
34
+ lastLoginAt: z.coerce.date().nullable().optional(),
35
+ mustChangePassword: z.boolean().optional(),
13
36
  emailVerified: z.boolean().optional(),
14
37
  phoneVerified: z.boolean().optional(),
15
38
  createdAt: z.coerce.date(),
@@ -43,23 +66,34 @@ var IamCurrentUserSchema = IamUserSchema.extend({
43
66
  permissions: z.array(z.string())
44
67
  });
45
68
  var IamLoginInputSchema = z.object({
69
+ expectedUserId: z.string().min(1).max(200).optional(),
70
+ captcha: captchaProofSchema,
46
71
  identifier: z.string().min(1),
47
72
  password: z.string().min(1)
48
73
  });
49
- var IamLdapLoginInputSchema = z.object({ username: z.string().trim().min(1), password: z.string().min(1) });
50
- var IamRequestPasswordResetInputSchema = z.object({ identifier: z.string().trim().min(1) });
74
+ var IamSessionErrorCodeSchema = z.enum(["hai:iam:101", "hai:iam:102", "hai:iam:103", "hai:iam:105", "hai:iam:106", "hai:iam:107"]);
75
+ var IamLdapLoginInputSchema = z.object({ username: z.string().trim().min(1), password: z.string().min(1), captcha: captchaProofSchema, expectedUserId: z.string().min(1).max(200).optional() });
76
+ var IamRequestPasswordResetInputSchema = z.object({ identifier: z.string().trim().min(1), captcha: captchaProofSchema });
51
77
  var IamConfirmPasswordResetInputSchema = z.object({ token: z.string().min(1), newPassword: z.string().min(1) });
78
+ var IamRenewPasswordInputSchema = z.object({ identifier: z.string().trim().min(1), password: z.string().min(1), newPassword: z.string().min(1), captcha: captchaProofSchema });
79
+ var IamReauthenticateInputSchema = z.object({ password: z.string().min(1), operation: z.string().trim().min(1).max(128) });
80
+ var IamReauthenticationProofSchema = z.object({ ticket: z.string().min(1), expiresAt: z.number() });
52
81
  var IamPublicConfigSchema = z.object({
53
- password: z.object({ minLength: z.number(), maxLength: z.number(), requireUppercase: z.boolean(), requireLowercase: z.boolean(), requireNumber: z.boolean(), requireSpecialChar: z.boolean(), expirationDays: z.number() }),
82
+ captcha: z.object({ enabled: z.boolean() }).default({ enabled: false }),
83
+ reauthentication: z.object({ enabled: z.boolean(), operations: z.array(z.string()) }).optional(),
84
+ initialCredentials: z.object({ enabled: z.boolean() }).optional(),
85
+ password: z.object({ minLength: z.number(), maxLength: z.number(), requireUppercase: z.boolean(), requireLowercase: z.boolean(), requireNumber: z.boolean(), requireSpecialChar: z.boolean(), expirationDays: z.number(), minCharacterClasses: z.number().optional(), preventSamePassword: z.boolean().optional(), requireInitialChange: z.boolean().optional() }),
54
86
  register: z.object({ enabled: z.boolean() }),
55
87
  login: z.object({ password: z.boolean(), otp: z.boolean(), ldap: z.boolean(), email: z.boolean(), sms: z.boolean() }),
56
88
  passwordReset: z.object({ enabled: z.boolean(), mode: z.enum(["email", "phone"]) }),
57
89
  otp: z.object({ length: z.number(), resendInterval: z.number() }),
58
90
  agreements: IamAgreementDisplaySchema,
59
91
  ui: z.object({ variant: z.enum(["card", "split"]), title: z.string().optional(), subtitle: z.string().optional(), brandTitle: z.string().optional(), brandText: z.string().optional(), logoUrl: z.string().optional(), illustrationUrl: z.string().optional() }),
60
- session: z.object({ maxAge: z.number() })
92
+ session: z.object({ maxAge: z.number(), endOnPageHide: z.boolean().default(false) })
61
93
  });
62
94
  var IamOtpLoginInputSchema = z.object({
95
+ expectedUserId: z.string().min(1).max(200).optional(),
96
+ captcha: captchaProofSchema,
63
97
  identifier: z.string().min(1),
64
98
  code: z.string().min(1)
65
99
  });
@@ -67,6 +101,7 @@ var IamLogoutInputSchema = z.object({
67
101
  accessToken: z.string().min(1).optional()
68
102
  });
69
103
  var IamSendOtpInputSchema = z.object({
104
+ captcha: captchaProofSchema,
70
105
  identifier: z.string().min(1)
71
106
  });
72
107
  var IamSendOtpDataSchema = z.object({
@@ -79,6 +114,7 @@ var IamRefreshTokenDataSchema = z.object({
79
114
  tokens: IamTokenPairSchema
80
115
  });
81
116
  var IamRegisterInputSchema = z.object({
117
+ captcha: captchaProofSchema,
82
118
  username: z.string().min(1),
83
119
  password: z.string().min(1),
84
120
  email: z.string().email().optional(),
@@ -105,6 +141,9 @@ var IamListUsersInputSchema = PaginationQuerySchema.extend({
105
141
  enabled: z.enum(["true", "false"]).optional().transform((v) => v === void 0 ? void 0 : v === "true")
106
142
  });
107
143
  var IamAdminCreateUserInputSchema = z.object({
144
+ accountType: z.enum(["permanent", "temporary"]).optional(),
145
+ accountStatus: z.enum(["active", "dormant", "closed"]).optional(),
146
+ accountExpiresAt: z.coerce.date().optional(),
108
147
  username: z.string().min(1),
109
148
  email: z.string().email().optional(),
110
149
  phone: z.string().optional(),
@@ -114,7 +153,11 @@ var IamAdminCreateUserInputSchema = z.object({
114
153
  roleIds: z.array(z.string()).optional(),
115
154
  enabled: z.boolean().optional()
116
155
  });
156
+ var IamInviteUserInputSchema = IamAdminCreateUserInputSchema.omit({ password: true }).extend({ enabled: z.literal(true).optional(), accountStatus: z.literal("active").optional() });
117
157
  var IamAdminUpdateUserInputSchema = z.object({
158
+ accountType: z.enum(["permanent", "temporary"]).optional(),
159
+ accountStatus: z.enum(["active", "dormant", "closed"]).optional(),
160
+ accountExpiresAt: z.coerce.date().nullable().optional(),
118
161
  id: z.string().min(1),
119
162
  username: z.string().min(1).optional(),
120
163
  email: z.string().email().optional(),
@@ -154,6 +197,7 @@ var IamUpdateRoleInputSchema = z.object({
154
197
  });
155
198
  var IamPermissionTypeSchema = z.enum(["menu", "api", "button"]);
156
199
  var IamPermissionSchema = z.object({
200
+ sensitiveOperations: z.array(z.string().trim().min(1).max(128)).max(1e3).nullish().transform((value) => value ?? []),
157
201
  id: z.string(),
158
202
  code: z.string(),
159
203
  name: z.string(),
@@ -169,6 +213,7 @@ var IamListPermissionsInputSchema = PaginationQuerySchema.extend({
169
213
  type: IamPermissionTypeSchema.optional()
170
214
  });
171
215
  var IamCreatePermissionInputSchema = z.object({
216
+ sensitiveOperations: z.array(z.string().trim().min(1).max(128)).max(1e3).default([]),
172
217
  code: z.string().min(1),
173
218
  name: z.string().min(1),
174
219
  description: z.string().optional(),
@@ -183,13 +228,17 @@ var userOutputSchema = haiResultSchema(IamUserSchema);
183
228
  var roleOutputSchema = haiResultSchema(IamRoleSchema);
184
229
  var iamContract = {
185
230
  auth: {
231
+ createCaptcha: route({ method: "POST", path: "/auth/captcha", operationId: "iam.auth.createCaptcha", summary: "Create self-hosted security challenge", tags: ["iam", "auth"] }).input(IamCreateCaptchaInputSchema).output(haiResultSchema(IamCaptchaChallengeSchema)),
232
+ reauthenticate: route({ method: "POST", path: "/auth/reauthenticate", operationId: "iam.auth.reauthenticate", summary: "Verify current password for one sensitive operation", tags: ["iam", "auth"] }).input(IamReauthenticateInputSchema).output(haiResultSchema(IamReauthenticationProofSchema)),
186
233
  publicConfig: route({ method: "GET", path: "/auth/config", operationId: "iam.auth.publicConfig", summary: "Public authentication configuration", tags: ["iam", "auth"] }).output(haiResultSchema(IamPublicConfigSchema.nullable())),
234
+ renewPassword: route({ method: "POST", path: "/auth/password/renew", operationId: "iam.auth.renewPassword", summary: "Change initial or expired password", tags: ["iam", "auth"] }).input(IamRenewPasswordInputSchema).output(HaiVoidResultSchema),
187
235
  loginWithLdap: route({ method: "POST", path: "/auth/login/ldap", operationId: "iam.auth.loginWithLdap", summary: "LDAP login", tags: ["iam", "auth"] }).input(IamLdapLoginInputSchema).output(authResultOutputSchema),
188
236
  requestPasswordReset: route({ method: "POST", path: "/auth/password-reset/request", operationId: "iam.auth.requestPasswordReset", summary: "Request password reset", tags: ["iam", "auth"] }).input(IamRequestPasswordResetInputSchema).output(HaiVoidResultSchema),
189
237
  confirmPasswordReset: route({ method: "POST", path: "/auth/password-reset/confirm", operationId: "iam.auth.confirmPasswordReset", summary: "Confirm password reset", tags: ["iam", "auth"] }).input(IamConfirmPasswordResetInputSchema).output(HaiVoidResultSchema),
190
238
  login: route({ method: "POST", path: "/auth/login", operationId: "iam.auth.login", summary: "Password login", tags: ["iam", "auth"] }).input(IamLoginInputSchema).output(authResultOutputSchema),
191
239
  loginWithOtp: route({ method: "POST", path: "/auth/login/otp", operationId: "iam.auth.loginWithOtp", summary: "OTP login", tags: ["iam", "auth"] }).input(IamOtpLoginInputSchema).output(authResultOutputSchema),
192
240
  logout: route({ method: "POST", path: "/auth/logout", operationId: "iam.auth.logout", summary: "Logout", tags: ["iam", "auth"] }).input(IamLogoutInputSchema).output(HaiVoidResultSchema),
241
+ closeSession: route({ method: "POST", path: "/auth/session/close", operationId: "iam.auth.closeSession", summary: "Revoke departing client session without clearing newer cookies", tags: ["iam", "auth"] }).input(IamLogoutInputSchema).output(HaiVoidResultSchema),
193
242
  currentUser: route({ method: "GET", path: "/auth/me", operationId: "iam.auth.currentUser", summary: "Get current user and access scope", tags: ["iam", "auth"] }).output(haiResultSchema(IamCurrentUserSchema)),
194
243
  refresh: route({ method: "POST", path: "/auth/refresh", operationId: "iam.auth.refresh", summary: "Refresh access token", tags: ["iam", "auth"] }).input(IamRefreshTokenInputSchema).output(haiResultSchema(IamRefreshTokenDataSchema)),
195
244
  sendOtp: route({ method: "POST", path: "/auth/otp/send", operationId: "iam.auth.sendOtp", summary: "Send OTP", tags: ["iam", "auth"] }).input(IamSendOtpInputSchema).output(haiResultSchema(IamSendOtpDataSchema)),
@@ -198,6 +247,7 @@ var iamContract = {
198
247
  updateCurrentUser: route({ method: "PUT", path: "/auth/me", operationId: "iam.auth.updateCurrentUser", summary: "Update current user", tags: ["iam", "auth"] }).input(IamUpdateCurrentUserInputSchema).output(userOutputSchema)
199
248
  },
200
249
  users: {
250
+ invite: route({ method: "POST", path: "/iam/users/invite", operationId: "iam.users.invite", summary: "Create account with one-time setup invitation", tags: ["iam", "users"] }).input(IamInviteUserInputSchema).output(userOutputSchema),
201
251
  list: route({ method: "GET", path: "/iam/users", operationId: "iam.users.list", summary: "List users", tags: ["iam", "users"] }).input(IamListUsersInputSchema).output(haiResultSchema(paginatedSchema(IamUserSchema))),
202
252
  get: route({ method: "GET", path: "/iam/users/{id}", operationId: "iam.users.get", summary: "Get user", tags: ["iam", "users"] }).input(IamUserIdInputSchema).output(haiResultSchema(IamUserSchema.nullable())),
203
253
  create: route({ method: "POST", path: "/iam/users", operationId: "iam.users.create", summary: "Create user", tags: ["iam", "users"] }).input(IamAdminCreateUserInputSchema).output(userOutputSchema),
@@ -213,6 +263,7 @@ var iamContract = {
213
263
  delete: route({ method: "DELETE", path: "/iam/roles/{id}", operationId: "iam.roles.delete", summary: "Delete role", tags: ["iam", "roles"] }).input(IamUserIdInputSchema).output(HaiVoidResultSchema)
214
264
  },
215
265
  permissions: {
266
+ setSensitiveOperations: route({ method: "PUT", path: "/iam/permissions/{id}/sensitive-operations", operationId: "iam.permissions.sensitiveOperations", summary: "Set permission sensitive operations", tags: ["iam", "permissions"] }).input(IamPermissionSchema.pick({ id: true, sensitiveOperations: true })).output(HaiVoidResultSchema),
216
267
  list: route({ method: "GET", path: "/iam/permissions", operationId: "iam.permissions.list", summary: "List permissions", tags: ["iam", "permissions"] }).input(IamListPermissionsInputSchema).output(haiResultSchema(paginatedSchema(IamPermissionSchema))),
217
268
  get: route({ method: "GET", path: "/iam/permissions/{id}", operationId: "iam.permissions.get", summary: "Get permission", tags: ["iam", "permissions"] }).input(IamUserIdInputSchema).output(haiResultSchema(IamPermissionSchema.nullable())),
218
269
  create: route({ method: "POST", path: "/iam/permissions", operationId: "iam.permissions.create", summary: "Create permission", tags: ["iam", "permissions"] }).input(IamCreatePermissionInputSchema).output(haiResultSchema(IamPermissionSchema)),
@@ -220,6 +271,6 @@ var iamContract = {
220
271
  }
221
272
  };
222
273
 
223
- export { IamAdminCreateUserInputSchema, IamAdminResetPasswordInputSchema, IamAdminUpdateUserInputSchema, IamAgreementDisplaySchema, IamAuthResultSchema, IamChangePasswordInputSchema, IamConfirmPasswordResetInputSchema, IamCreatePermissionInputSchema, IamCreateRoleInputSchema, IamCurrentUserSchema, IamLdapLoginInputSchema, IamListPermissionsInputSchema, IamListUsersInputSchema, IamLoginInputSchema, IamLogoutInputSchema, IamOtpLoginInputSchema, IamPermissionSchema, IamPermissionTypeSchema, IamPublicConfigSchema, IamRefreshTokenDataSchema, IamRefreshTokenInputSchema, IamRegisterInputSchema, IamRequestPasswordResetInputSchema, IamRoleSchema, IamSendOtpDataSchema, IamSendOtpInputSchema, IamTokenPairSchema, IamUpdateCurrentUserInputSchema, IamUpdateRoleInputSchema, IamUserIdInputSchema, IamUserSchema, iamContract };
224
- //# sourceMappingURL=chunk-DL2OYVLO.js.map
225
- //# sourceMappingURL=chunk-DL2OYVLO.js.map
274
+ export { IamAdminCreateUserInputSchema, IamAdminResetPasswordInputSchema, IamAdminUpdateUserInputSchema, IamAgreementDisplaySchema, IamAuthResultSchema, IamCaptchaChallengeSchema, IamChangePasswordInputSchema, IamConfirmPasswordResetInputSchema, IamCreateCaptchaInputSchema, IamCreatePermissionInputSchema, IamCreateRoleInputSchema, IamCurrentUserSchema, IamInviteUserInputSchema, IamLdapLoginInputSchema, IamListPermissionsInputSchema, IamListUsersInputSchema, IamLoginInputSchema, IamLogoutInputSchema, IamOtpLoginInputSchema, IamPermissionSchema, IamPermissionTypeSchema, IamPublicConfigSchema, IamReauthenticateInputSchema, IamReauthenticationProofSchema, IamRefreshTokenDataSchema, IamRefreshTokenInputSchema, IamRegisterInputSchema, IamRenewPasswordInputSchema, IamRequestPasswordResetInputSchema, IamRoleSchema, IamSendOtpDataSchema, IamSendOtpInputSchema, IamSessionErrorCodeSchema, IamTokenPairSchema, IamUpdateCurrentUserInputSchema, IamUpdateRoleInputSchema, IamUserIdInputSchema, IamUserSchema, iamContract };
275
+ //# sourceMappingURL=chunk-RN3KGYTF.js.map
276
+ //# sourceMappingURL=chunk-RN3KGYTF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/iam/iam-schemas.ts","../src/iam/iam-contract.ts"],"names":[],"mappings":"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","file":"chunk-RN3KGYTF.js","sourcesContent":["/**\n * @h-ai/api-contract — IAM 领域 Schema\n *\n * 包含用户、Token、角色、权限以及相关 input/data 的 Zod Schema 定义。\n * 一次性输出包装在 contract 中内联,仅保留跨接口、跨层复用的数据结构。\n * @module iam-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { z } from 'zod'\nimport { PaginationQuerySchema } from '../common/pagination-schemas.js'\n\nconst captchaProofSchema = z.string().min(1).max(4096).optional()\n\n/**\n * 交互挑战生成入参,证明只能用于指定入口。\n * @example\n * ```ts\n * import { IamCreateCaptchaInputSchema } from '@h-ai/api-contract'\n * const input = IamCreateCaptchaInputSchema.parse({ operation: 'login' })\n * ```\n */\nexport const IamCreateCaptchaInputSchema = z.object({ operation: z.enum(['login', 'register', 'sendOtp', 'passwordReset', 'renewPassword']) })\n\n/**\n * 自托管 ALTCHA 可公开挑战;不会返回签名秘密。\n * @example\n * ```ts\n * import { IamCaptchaChallengeSchema } from '@h-ai/api-contract'\n * function parseResponse(value: unknown) { return IamCaptchaChallengeSchema.parse(value) }\n * ```\n */\nexport const IamCaptchaChallengeSchema = z.object({\n id: z.string().regex(/^[a-f0-9]{64}$/),\n challenge: z.object({\n signature: z.string().max(256).optional(),\n parameters: z.object({\n algorithm: z.string().refine(value => value === 'PBKDF2/SHA-256'),\n nonce: z.string().min(1).max(256),\n salt: z.string().min(1).max(256),\n cost: z.number().int().min(100).max(50000),\n keyLength: z.number().int().min(16).max(64),\n keyPrefix: z.string().min(1).max(128),\n keySignature: z.string().max(256).optional(),\n data: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(),\n }),\n }),\n})\n\n/**\n * 用户基础信息 Schema。\n * @example\n * ```ts\n * import { IamUserSchema } from '@h-ai/api-contract'\n *\n * const value = IamUserSchema.parse({\n * id: 'example-1',\n * username: 'alice',\n * enabled: true,\n * createdAt: null,\n * updatedAt: null\n * })\n * void value\n * ```\n */\nexport const IamUserSchema = z.object({\n id: z.string(),\n username: z.string(),\n email: z.string().optional(),\n phone: z.string().optional(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n enabled: z.boolean(),\n accountType: z.enum(['permanent', 'temporary']).optional(),\n accountStatus: z.enum(['active', 'dormant', 'closed']).optional(),\n accountExpiresAt: z.coerce.date().nullable().optional(),\n lastLoginAt: z.coerce.date().nullable().optional(),\n mustChangePassword: z.boolean().optional(),\n emailVerified: z.boolean().optional(),\n phoneVerified: z.boolean().optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * Token 对 Schema。\n * @example\n * ```ts\n * import { IamTokenPairSchema } from '@h-ai/api-contract'\n *\n * const value = IamTokenPairSchema.parse({\n * accessToken: 'example-only-access',\n * expiresIn: 0,\n * tokenType: 'Bearer'\n * })\n * void value\n * ```\n */\nexport const IamTokenPairSchema = z.object({\n accessToken: z.string(),\n refreshToken: z.string().optional(),\n expiresIn: z.number(),\n tokenType: z.literal('Bearer'),\n})\n\n/**\n * 协议展示 Schema。\n * @example\n * ```ts\n * import { IamAgreementDisplaySchema } from '@h-ai/api-contract'\n *\n * const value = IamAgreementDisplaySchema.parse({\n * showOnRegister: true,\n * showOnLogin: true\n * })\n * void value\n * ```\n */\nexport const IamAgreementDisplaySchema = z.object({\n /** 配置中的 Markdown 原文由客户端安全渲染。 */\n userAgreementMarkdown: z.string().min(1).optional(),\n privacyPolicyMarkdown: z.string().min(1).optional(),\n userAgreementUrl: z.string().optional(),\n privacyPolicyUrl: z.string().optional(),\n showOnRegister: z.boolean(),\n showOnLogin: z.boolean(),\n})\n\n/**\n * 登录结果业务数据 Schema。\n * @example\n * ```ts\n * import { IamAuthResultSchema } from '@h-ai/api-contract'\n *\n * const value = IamAuthResultSchema.parse({\n * user: {\n * id: 'example-1',\n * username: 'alice',\n * enabled: true,\n * createdAt: null,\n * updatedAt: null\n * },\n * tokens: {\n * accessToken: 'example-only-access',\n * expiresIn: 0,\n * tokenType: 'Bearer'\n * }\n * })\n * void value\n * ```\n */\nexport const IamAuthResultSchema = z.object({\n user: IamUserSchema,\n tokens: IamTokenPairSchema,\n roles: z.array(z.string()).default([]),\n permissions: z.array(z.string()).default([]),\n agreements: IamAgreementDisplaySchema.optional(),\n})\n\n/**\n * 当前会话用户信息;包含服务端重新校验后的角色与权限快照。\n * @example\n * ```ts\n * import { IamCurrentUserSchema } from '@h-ai/api-contract'\n *\n * const value = IamCurrentUserSchema.parse({\n * id: 'example-1',\n * username: 'alice',\n * enabled: true,\n * createdAt: null,\n * updatedAt: null,\n * roles: [\n * 'example'\n * ],\n * permissions: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport const IamCurrentUserSchema = IamUserSchema.extend({\n roles: z.array(z.string()),\n permissions: z.array(z.string()),\n})\n\n/**\n * 密码登录入参 Schema。\n * @example\n * ```ts\n * import { IamLoginInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamLoginInputSchema.parse({\n * identifier: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamLoginInputSchema = z.object({\n expectedUserId: z.string().min(1).max(200).optional(),\n captcha: captchaProofSchema,\n identifier: z.string().min(1),\n password: z.string().min(1),\n})\n\n/**\n * 可以尝试刷新或恢复登录的IAM会话错误码;密码错误、初始/过期改密与操作二次认证不属于会话恢复。\n * @example\n * ```ts\n * import { IamSessionErrorCodeSchema } from '@h-ai/api-contract'\n * const expired = IamSessionErrorCodeSchema.safeParse('hai:iam:103').success\n * ```\n */\nexport const IamSessionErrorCodeSchema = z.enum(['hai:iam:101', 'hai:iam:102', 'hai:iam:103', 'hai:iam:105', 'hai:iam:106', 'hai:iam:107'])\n\n/**\n * LDAP 登录与密码找回入参。\n * @example\n * ```ts\n * import { IamLdapLoginInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamLdapLoginInputSchema.parse({\n * username: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamLdapLoginInputSchema = z.object({ username: z.string().trim().min(1), password: z.string().min(1), captcha: captchaProofSchema, expectedUserId: z.string().min(1).max(200).optional() })\n/**\n * IamRequestPasswordResetInput 数据的运行时 Zod 校验约束。\n * @example\n * ```ts\n * import { IamRequestPasswordResetInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamRequestPasswordResetInputSchema.parse({\n * identifier: 'alice'\n * })\n * void value\n * ```\n */\nexport const IamRequestPasswordResetInputSchema = z.object({ identifier: z.string().trim().min(1), captcha: captchaProofSchema })\n/**\n * IamConfirmPasswordResetInput 数据的运行时 Zod 校验约束。\n * @example\n * ```ts\n * import { IamConfirmPasswordResetInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamConfirmPasswordResetInputSchema.parse({\n * token: 'example-only-token',\n * newPassword: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamConfirmPasswordResetInputSchema = z.object({ token: z.string().min(1), newPassword: z.string().min(1) })\n\n/**\n * 无普通会话的首次或过期改密;必须重新验证原密码。\n * @example\n * ```ts\n * import { IamRenewPasswordInputSchema } from '@h-ai/api-contract'\n * const input = IamRenewPasswordInputSchema.parse({ identifier: 'alice', password: 'Initial123!', newPassword: 'Chosen456!' })\n * ```\n */\nexport const IamRenewPasswordInputSchema = z.object({ identifier: z.string().trim().min(1), password: z.string().min(1), newPassword: z.string().min(1), captcha: captchaProofSchema })\n\n/**\n * 对当前会话的指定操作重新鉴别;操作本身仍需独立授权。\n * @example\n * ```ts\n * import { IamReauthenticateInputSchema } from '@h-ai/api-contract'\n * const input = IamReauthenticateInputSchema.parse({ password: 'ChosenPassword123!', operation: 'iam.users.delete' })\n * ```\n */\nexport const IamReauthenticateInputSchema = z.object({ password: z.string().min(1), operation: z.string().trim().min(1).max(128) })\n\n/**\n * 短期、用途绑定的单次操作证明,不能持久化到浏览器存储。\n * @example\n * ```ts\n * import { IamReauthenticationProofSchema } from '@h-ai/api-contract'\n * const proof = IamReauthenticationProofSchema.parse({ ticket: 'example-only-ticket', expiresAt: Date.now() + 300000 })\n * ```\n */\nexport const IamReauthenticationProofSchema = z.object({ ticket: z.string().min(1), expiresAt: z.number() })\n\n/**\n * 认证页面公开配置白名单,独立于服务端连接/凭据配置。\n * @example\n * ```ts\n * import { IamPublicConfigSchema } from '@h-ai/api-contract'\n *\n * const value = IamPublicConfigSchema.parse({\n * password: {\n * minLength: 0,\n * maxLength: 0,\n * requireUppercase: true,\n * requireLowercase: true,\n * requireNumber: true,\n * requireSpecialChar: true,\n * expirationDays: 0\n * },\n * register: {\n * enabled: true\n * },\n * login: {\n * password: true,\n * otp: true,\n * ldap: true,\n * email: true,\n * sms: true\n * },\n * passwordReset: {\n * enabled: true,\n * mode: 'email'\n * },\n * otp: {\n * length: 0,\n * resendInterval: 0\n * },\n * agreements: {\n * showOnRegister: true,\n * showOnLogin: true\n * },\n * ui: {\n * variant: 'card'\n * },\n * session: {\n * maxAge: 0\n * }\n * })\n * void value\n * ```\n */\nexport const IamPublicConfigSchema = z.object({\n captcha: z.object({ enabled: z.boolean() }).default({ enabled: false }),\n reauthentication: z.object({ enabled: z.boolean(), operations: z.array(z.string()) }).optional(),\n initialCredentials: z.object({ enabled: z.boolean() }).optional(),\n password: z.object({ minLength: z.number(), maxLength: z.number(), requireUppercase: z.boolean(), requireLowercase: z.boolean(), requireNumber: z.boolean(), requireSpecialChar: z.boolean(), expirationDays: z.number(), minCharacterClasses: z.number().optional(), preventSamePassword: z.boolean().optional(), requireInitialChange: z.boolean().optional() }),\n register: z.object({ enabled: z.boolean() }),\n login: z.object({ password: z.boolean(), otp: z.boolean(), ldap: z.boolean(), email: z.boolean(), sms: z.boolean() }),\n passwordReset: z.object({ enabled: z.boolean(), mode: z.enum(['email', 'phone']) }),\n otp: z.object({ length: z.number(), resendInterval: z.number() }),\n agreements: IamAgreementDisplaySchema,\n ui: z.object({ variant: z.enum(['card', 'split']), title: z.string().optional(), subtitle: z.string().optional(), brandTitle: z.string().optional(), brandText: z.string().optional(), logoUrl: z.string().optional(), illustrationUrl: z.string().optional() }),\n session: z.object({ maxAge: z.number(), endOnPageHide: z.boolean().default(false) }),\n})\n\n/**\n * OTP 登录入参 Schema。\n * @example\n * ```ts\n * import { IamOtpLoginInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamOtpLoginInputSchema.parse({\n * identifier: 'alice',\n * code: 'example-1'\n * })\n * void value\n * ```\n */\nexport const IamOtpLoginInputSchema = z.object({\n expectedUserId: z.string().min(1).max(200).optional(),\n captcha: captchaProofSchema,\n identifier: z.string().min(1),\n code: z.string().min(1),\n})\n\n/**\n * 登出入参 Schema。\n * 仅撤销调用方持有的完整 accessToken;省略时使用 Authorization Bearer,二者均无值则失败。\n * access 已到期仍可撤销关联 refresh;此入口不按 userId 撤销,也不授予任何身份权限。\n * @example\n * ```ts\n * import { IamLogoutInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamLogoutInputSchema.parse({})\n * void value\n * ```\n */\nexport const IamLogoutInputSchema = z.object({\n accessToken: z.string().min(1).optional(),\n})\n\n/**\n * 发送 OTP 入参 Schema。\n * @example\n * ```ts\n * import { IamSendOtpInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamSendOtpInputSchema.parse({\n * identifier: 'alice'\n * })\n * void value\n * ```\n */\nexport const IamSendOtpInputSchema = z.object({\n captcha: captchaProofSchema,\n identifier: z.string().min(1),\n})\n\n/**\n * 发送 OTP 业务数据 Schema。\n * @example\n * ```ts\n * import { IamSendOtpDataSchema } from '@h-ai/api-contract'\n *\n * const value = IamSendOtpDataSchema.parse({\n * expiresAt: null\n * })\n * void value\n * ```\n */\nexport const IamSendOtpDataSchema = z.object({\n expiresAt: z.coerce.date(),\n})\n\n/**\n * Token 刷新入参 Schema。\n * @example\n * ```ts\n * import { IamRefreshTokenInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamRefreshTokenInputSchema.parse({\n * refreshToken: 'example-only-refresh'\n * })\n * void value\n * ```\n */\nexport const IamRefreshTokenInputSchema = z.object({\n refreshToken: z.string().min(1),\n})\n\n/**\n * Token 刷新业务数据 Schema。\n * @example\n * ```ts\n * import { IamRefreshTokenDataSchema } from '@h-ai/api-contract'\n *\n * const value = IamRefreshTokenDataSchema.parse({\n * tokens: {\n * accessToken: 'example-only-access',\n * expiresIn: 0,\n * tokenType: 'Bearer'\n * }\n * })\n * void value\n * ```\n */\nexport const IamRefreshTokenDataSchema = z.object({\n tokens: IamTokenPairSchema,\n})\n\n/**\n * 注册入参 Schema。\n * @example\n * ```ts\n * import { IamRegisterInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamRegisterInputSchema.parse({\n * username: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamRegisterInputSchema = z.object({\n captcha: captchaProofSchema,\n username: z.string().min(1),\n password: z.string().min(1),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n displayName: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * 修改密码入参 Schema。\n * @example\n * ```ts\n * import { IamChangePasswordInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamChangePasswordInputSchema.parse({\n * oldPassword: 'example',\n * newPassword: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamChangePasswordInputSchema = z.object({\n oldPassword: z.string().min(1),\n newPassword: z.string().min(1),\n})\n\n/**\n * 当前用户更新入参 Schema。\n * @example\n * ```ts\n * import { IamUpdateCurrentUserInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamUpdateCurrentUserInputSchema.parse({})\n * void value\n * ```\n */\nexport const IamUpdateCurrentUserInputSchema = z.object({\n username: z.string().min(1).optional(),\n email: z.string().email().optional(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n phone: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * 用户列表查询入参 Schema。\n * @example\n * ```ts\n * import { IamListUsersInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamListUsersInputSchema.parse({})\n * void value\n * ```\n */\nexport const IamListUsersInputSchema = PaginationQuerySchema.extend({\n roleCode: z.string().trim().min(1).max(100).optional(),\n search: z.string().optional(),\n // 注意:HTTP query 是字符串,使用枚举 + transform 避免 z.coerce.boolean 的 'false' → true 陷阱。\n enabled: z.enum(['true', 'false']).optional().transform(v => v === undefined ? undefined : v === 'true'),\n})\n\n/**\n * Admin 创建用户入参 Schema。\n * @example\n * ```ts\n * import { IamAdminCreateUserInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamAdminCreateUserInputSchema.parse({\n * username: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamAdminCreateUserInputSchema = z.object({\n accountType: z.enum(['permanent', 'temporary']).optional(),\n accountStatus: z.enum(['active', 'dormant', 'closed']).optional(),\n accountExpiresAt: z.coerce.date().optional(),\n username: z.string().min(1),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n password: z.string().min(1),\n displayName: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n roleIds: z.array(z.string()).optional(),\n enabled: z.boolean().optional(),\n})\n\n/**\n * 管理端单次邀请不接收共享初始密码;初始账号必须启用且激活。\n * @example\n * ```ts\n * import { IamInviteUserInputSchema } from '@h-ai/api-contract'\n * const input = IamInviteUserInputSchema.parse({ username: 'alice', email: 'alice@example.com' })\n * ```\n */\nexport const IamInviteUserInputSchema = IamAdminCreateUserInputSchema.omit({ password: true }).extend({ enabled: z.literal(true).optional(), accountStatus: z.literal('active').optional() })\n\n/**\n * 单次邀请的管理端输入。\n * @example\n * ```ts\n * import type { IamInviteUserInput } from '@h-ai/api-contract'\n * const input: IamInviteUserInput = { username: 'alice', email: 'alice@example.com' }\n * ```\n */\nexport type IamInviteUserInput = z.infer<typeof IamInviteUserInputSchema>\n\n/**\n * Admin 更新用户入参 Schema。\n * @example\n * ```ts\n * import { IamAdminUpdateUserInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamAdminUpdateUserInputSchema.parse({\n * id: 'example-1'\n * })\n * void value\n * ```\n */\nexport const IamAdminUpdateUserInputSchema = z.object({\n accountType: z.enum(['permanent', 'temporary']).optional(),\n accountStatus: z.enum(['active', 'dormant', 'closed']).optional(),\n accountExpiresAt: z.coerce.date().nullable().optional(),\n id: z.string().min(1),\n username: z.string().min(1).optional(),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n enabled: z.boolean().optional(),\n roleIds: z.array(z.string()).optional(),\n})\n\n/**\n * Admin 删除用户入参 Schema。\n * @example\n * ```ts\n * import { IamUserIdInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamUserIdInputSchema.parse({\n * id: 'example-1'\n * })\n * void value\n * ```\n */\nexport const IamUserIdInputSchema = z.object({\n id: z.string().min(1),\n})\n\n/**\n * Admin 重置密码入参 Schema。\n * @example\n * ```ts\n * import { IamAdminResetPasswordInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamAdminResetPasswordInputSchema.parse({\n * id: 'example-1',\n * newPassword: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport const IamAdminResetPasswordInputSchema = z.object({\n id: z.string().min(1),\n newPassword: z.string().min(1),\n})\n\n/**\n * 角色基础信息 Schema。\n * @example\n * ```ts\n * import { IamRoleSchema } from '@h-ai/api-contract'\n *\n * const value = IamRoleSchema.parse({\n * id: 'example-1',\n * code: 'example-1',\n * name: 'Example',\n * createdAt: null,\n * updatedAt: null\n * })\n * void value\n * ```\n */\nexport const IamRoleSchema = z.object({\n id: z.string(),\n code: z.string(),\n name: z.string(),\n description: z.string().optional(),\n isSystem: z.boolean().optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n})\n\n/**\n * 创建角色入参 Schema。\n * @example\n * ```ts\n * import { IamCreateRoleInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamCreateRoleInputSchema.parse({\n * code: 'example-1',\n * name: 'Example'\n * })\n * void value\n * ```\n */\nexport const IamCreateRoleInputSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n isSystem: z.boolean().optional(),\n})\n\n/**\n * 更新角色入参 Schema。\n * @example\n * ```ts\n * import { IamUpdateRoleInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamUpdateRoleInputSchema.parse({\n * id: 'example-1'\n * })\n * void value\n * ```\n */\nexport const IamUpdateRoleInputSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n})\n\n/**\n * 权限类型 Schema。\n * @example\n * ```ts\n * import { IamPermissionTypeSchema } from '@h-ai/api-contract'\n *\n * const value = IamPermissionTypeSchema.parse('menu')\n * void value\n * ```\n */\nexport const IamPermissionTypeSchema = z.enum(['menu', 'api', 'button'])\n\n/**\n * 权限基础信息 Schema。\n * @example\n * ```ts\n * import { IamPermissionSchema } from '@h-ai/api-contract'\n *\n * const value = IamPermissionSchema.parse({\n * id: 'example-1',\n * code: 'example-1',\n * name: 'Example',\n * createdAt: null,\n * updatedAt: null\n * })\n * void value\n * ```\n */\nexport const IamPermissionSchema = z.object({\n sensitiveOperations: z.array(z.string().trim().min(1).max(128)).max(1000).nullish().transform(value => value ?? []),\n id: z.string(),\n code: z.string(),\n name: z.string(),\n description: z.string().optional(),\n type: IamPermissionTypeSchema.optional(),\n resource: z.string().optional(),\n action: z.string().optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n})\n\n/**\n * 权限列表查询入参 Schema。\n * @example\n * ```ts\n * import { IamListPermissionsInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamListPermissionsInputSchema.parse({})\n * void value\n * ```\n */\nexport const IamListPermissionsInputSchema = PaginationQuerySchema.extend({\n search: z.string().optional(),\n type: IamPermissionTypeSchema.optional(),\n})\n\n/**\n * 创建权限入参 Schema。\n * @example\n * ```ts\n * import { IamCreatePermissionInputSchema } from '@h-ai/api-contract'\n *\n * const value = IamCreatePermissionInputSchema.parse({\n * code: 'example-1',\n * name: 'Example'\n * })\n * void value\n * ```\n */\nexport const IamCreatePermissionInputSchema = z.object({\n sensitiveOperations: z.array(z.string().trim().min(1).max(128)).max(1000).default([]),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n resource: z.string().optional(),\n action: z.string().optional(),\n type: IamPermissionTypeSchema.optional(),\n})\n\n/**\n * 账号密码登录请求。\n * @example\n * ```ts\n * import type { IamLoginInput } from '@h-ai/api-contract'\n * import { IamLoginInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamLoginInput = IamLoginInputSchema.parse({\n * identifier: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport type IamLoginInput = z.infer<typeof IamLoginInputSchema>\n/**\n * LDAP 登录请求。\n * @example\n * ```ts\n * import type { IamLdapLoginInput } from '@h-ai/api-contract'\n * import { IamLdapLoginInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamLdapLoginInput = IamLdapLoginInputSchema.parse({\n * username: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport type IamLdapLoginInput = z.infer<typeof IamLdapLoginInputSchema>\n/**\n * 允许下发客户端的身份认证配置。\n * @example\n * ```ts\n * import type { IamPublicConfig } from '@h-ai/api-contract'\n * import { IamPublicConfigSchema } from '@h-ai/api-contract'\n *\n * const value: IamPublicConfig = IamPublicConfigSchema.parse({\n * password: {\n * minLength: 0,\n * maxLength: 0,\n * requireUppercase: true,\n * requireLowercase: true,\n * requireNumber: true,\n * requireSpecialChar: true,\n * expirationDays: 0\n * },\n * register: {\n * enabled: true\n * },\n * login: {\n * password: true,\n * otp: true,\n * ldap: true,\n * email: true,\n * sms: true\n * },\n * passwordReset: {\n * enabled: true,\n * mode: 'email'\n * },\n * otp: {\n * length: 0,\n * resendInterval: 0\n * },\n * agreements: {\n * showOnRegister: true,\n * showOnLogin: true\n * },\n * ui: {\n * variant: 'card'\n * },\n * session: {\n * maxAge: 0\n * }\n * })\n * void value\n * ```\n */\nexport type IamPublicConfig = z.infer<typeof IamPublicConfigSchema>\n/**\n * 一次性验证码登录请求。\n * @example\n * ```ts\n * import type { IamOtpLoginInput } from '@h-ai/api-contract'\n * import { IamOtpLoginInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamOtpLoginInput = IamOtpLoginInputSchema.parse({\n * identifier: 'alice',\n * code: 'example-1'\n * })\n * void value\n * ```\n */\nexport type IamOtpLoginInput = z.infer<typeof IamOtpLoginInputSchema>\n/**\n * 注销当前会话的请求。\n * @example\n * ```ts\n * import type { IamLogoutInput } from '@h-ai/api-contract'\n * import { IamLogoutInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamLogoutInput = IamLogoutInputSchema.parse({})\n * void value\n * ```\n */\nexport type IamLogoutInput = z.infer<typeof IamLogoutInputSchema>\n/**\n * 发送一次性验证码的请求。\n * @example\n * ```ts\n * import type { IamSendOtpInput } from '@h-ai/api-contract'\n * import { IamSendOtpInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamSendOtpInput = IamSendOtpInputSchema.parse({\n * identifier: 'alice'\n * })\n * void value\n * ```\n */\nexport type IamSendOtpInput = z.infer<typeof IamSendOtpInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 IamAuthResultOutput 响应。\n * @example\n * ```ts\n * import type { IamAuthResultOutput } from '@h-ai/api-contract'\n * import { IamAuthResultSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: IamAuthResultOutput = ok(IamAuthResultSchema.parse({\n * user: {\n * id: 'example-1',\n * username: 'alice',\n * enabled: true,\n * createdAt: null,\n * updatedAt: null\n * },\n * tokens: {\n * accessToken: 'example-only-access',\n * expiresIn: 0,\n * tokenType: 'Bearer'\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type IamAuthResultOutput = HaiResult<z.infer<typeof IamAuthResultSchema>>\n/**\n * 当前登录用户及其有效权限。\n * @example\n * ```ts\n * import type { IamCurrentUser } from '@h-ai/api-contract'\n * import { IamCurrentUserSchema } from '@h-ai/api-contract'\n *\n * const value: IamCurrentUser = IamCurrentUserSchema.parse({\n * id: 'example-1',\n * username: 'alice',\n * enabled: true,\n * createdAt: null,\n * updatedAt: null,\n * roles: [\n * 'example'\n * ],\n * permissions: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport type IamCurrentUser = z.infer<typeof IamCurrentUserSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 IamCurrentUserOutput 响应。\n * @example\n * ```ts\n * import type { IamCurrentUserOutput } from '@h-ai/api-contract'\n * import { IamCurrentUserSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: IamCurrentUserOutput = ok(IamCurrentUserSchema.parse({\n * id: 'example-1',\n * username: 'alice',\n * enabled: true,\n * createdAt: null,\n * updatedAt: null,\n * roles: [\n * 'example'\n * ],\n * permissions: [\n * 'example'\n * ]\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type IamCurrentUserOutput = HaiResult<IamCurrentUser>\n/**\n * 使用刷新凭据换取会话令牌的请求。\n * @example\n * ```ts\n * import type { IamRefreshTokenInput } from '@h-ai/api-contract'\n * import { IamRefreshTokenInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamRefreshTokenInput = IamRefreshTokenInputSchema.parse({\n * refreshToken: 'example-only-refresh'\n * })\n * void value\n * ```\n */\nexport type IamRefreshTokenInput = z.infer<typeof IamRefreshTokenInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 IamRefreshTokenOutput 响应。\n * @example\n * ```ts\n * import type { IamRefreshTokenOutput } from '@h-ai/api-contract'\n * import { IamRefreshTokenDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: IamRefreshTokenOutput = ok(IamRefreshTokenDataSchema.parse({\n * tokens: {\n * accessToken: 'example-only-access',\n * expiresIn: 0,\n * tokenType: 'Bearer'\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type IamRefreshTokenOutput = HaiResult<z.infer<typeof IamRefreshTokenDataSchema>>\n/**\n * 用户注册请求。\n * @example\n * ```ts\n * import type { IamRegisterInput } from '@h-ai/api-contract'\n * import { IamRegisterInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamRegisterInput = IamRegisterInputSchema.parse({\n * username: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport type IamRegisterInput = z.infer<typeof IamRegisterInputSchema>\n/**\n * 当前用户修改密码的请求。\n * @example\n * ```ts\n * import type { IamChangePasswordInput } from '@h-ai/api-contract'\n * import { IamChangePasswordInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamChangePasswordInput = IamChangePasswordInputSchema.parse({\n * oldPassword: 'example',\n * newPassword: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport type IamChangePasswordInput = z.infer<typeof IamChangePasswordInputSchema>\n/**\n * 修改当前用户资料的请求。\n * @example\n * ```ts\n * import type { IamUpdateCurrentUserInput } from '@h-ai/api-contract'\n * import { IamUpdateCurrentUserInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamUpdateCurrentUserInput = IamUpdateCurrentUserInputSchema.parse({})\n * void value\n * ```\n */\nexport type IamUpdateCurrentUserInput = z.infer<typeof IamUpdateCurrentUserInputSchema>\n/**\n * 管理员分页查询用户的请求。\n * @example\n * ```ts\n * import type { IamListUsersInput } from '@h-ai/api-contract'\n * import { IamListUsersInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamListUsersInput = IamListUsersInputSchema.parse({})\n * void value\n * ```\n */\nexport type IamListUsersInput = z.infer<typeof IamListUsersInputSchema>\n/**\n * 管理员创建用户的请求。\n * @example\n * ```ts\n * import type { IamAdminCreateUserInput } from '@h-ai/api-contract'\n * import { IamAdminCreateUserInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamAdminCreateUserInput = IamAdminCreateUserInputSchema.parse({\n * username: 'alice',\n * password: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport type IamAdminCreateUserInput = z.infer<typeof IamAdminCreateUserInputSchema>\n/**\n * 管理员修改用户的请求。\n * @example\n * ```ts\n * import type { IamAdminUpdateUserInput } from '@h-ai/api-contract'\n * import { IamAdminUpdateUserInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamAdminUpdateUserInput = IamAdminUpdateUserInputSchema.parse({\n * id: 'example-1'\n * })\n * void value\n * ```\n */\nexport type IamAdminUpdateUserInput = z.infer<typeof IamAdminUpdateUserInputSchema>\n/**\n * 以用户 ID 定位目标的请求。\n * @example\n * ```ts\n * import type { IamUserIdInput } from '@h-ai/api-contract'\n * import { IamUserIdInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamUserIdInput = IamUserIdInputSchema.parse({\n * id: 'example-1'\n * })\n * void value\n * ```\n */\nexport type IamUserIdInput = z.infer<typeof IamUserIdInputSchema>\n/**\n * 管理员重置用户密码的请求。\n * @example\n * ```ts\n * import type { IamAdminResetPasswordInput } from '@h-ai/api-contract'\n * import { IamAdminResetPasswordInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamAdminResetPasswordInput = IamAdminResetPasswordInputSchema.parse({\n * id: 'example-1',\n * newPassword: 'example-only-password'\n * })\n * void value\n * ```\n */\nexport type IamAdminResetPasswordInput = z.infer<typeof IamAdminResetPasswordInputSchema>\n/**\n * 创建角色的请求。\n * @example\n * ```ts\n * import type { IamCreateRoleInput } from '@h-ai/api-contract'\n * import { IamCreateRoleInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamCreateRoleInput = IamCreateRoleInputSchema.parse({\n * code: 'example-1',\n * name: 'Example'\n * })\n * void value\n * ```\n */\nexport type IamCreateRoleInput = z.infer<typeof IamCreateRoleInputSchema>\n/**\n * 修改角色的请求。\n * @example\n * ```ts\n * import type { IamUpdateRoleInput } from '@h-ai/api-contract'\n * import { IamUpdateRoleInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamUpdateRoleInput = IamUpdateRoleInputSchema.parse({\n * id: 'example-1'\n * })\n * void value\n * ```\n */\nexport type IamUpdateRoleInput = z.infer<typeof IamUpdateRoleInputSchema>\n/**\n * 分页查询权限定义的请求。\n * @example\n * ```ts\n * import type { IamListPermissionsInput } from '@h-ai/api-contract'\n * import { IamListPermissionsInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamListPermissionsInput = IamListPermissionsInputSchema.parse({})\n * void value\n * ```\n */\nexport type IamListPermissionsInput = z.infer<typeof IamListPermissionsInputSchema>\n/**\n * 创建权限定义的请求。\n * @example\n * ```ts\n * import type { IamCreatePermissionInput } from '@h-ai/api-contract'\n * import { IamCreatePermissionInputSchema } from '@h-ai/api-contract'\n *\n * const value: IamCreatePermissionInput = IamCreatePermissionInputSchema.parse({\n * code: 'example-1',\n * name: 'Example'\n * })\n * void value\n * ```\n */\nexport type IamCreatePermissionInput = z.infer<typeof IamCreatePermissionInputSchema>\n","/**\n * @h-ai/api-contract — IAM 领域 contract\n *\n * 定义身份认证与权限管理相关 API 的接口边界:\n * - auth:登录、登出、OTP、刷新 Token、注册、修改密码\n * - users:Admin 管理用户(CRUD + 重置密码)\n * - roles:Admin 管理角色(CRUD)\n * - permissions:Admin 管理权限(CRUD)\n *\n * auth.* 入口址前缀为 `/auth`;users/roles/permissions 前缀为 `/iam`。\n * @module iam-contract\n */\n\nimport { paginatedSchema } from '../common/pagination-schemas.js'\nimport { haiResultSchema, HaiVoidResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n IamAdminCreateUserInputSchema,\n IamAdminResetPasswordInputSchema,\n IamAdminUpdateUserInputSchema,\n IamAuthResultSchema,\n IamCaptchaChallengeSchema,\n IamChangePasswordInputSchema,\n IamConfirmPasswordResetInputSchema,\n IamCreateCaptchaInputSchema,\n IamCreatePermissionInputSchema,\n IamCreateRoleInputSchema,\n IamCurrentUserSchema,\n IamInviteUserInputSchema,\n IamLdapLoginInputSchema,\n IamListPermissionsInputSchema,\n IamListUsersInputSchema,\n IamLoginInputSchema,\n IamLogoutInputSchema,\n IamOtpLoginInputSchema,\n IamPermissionSchema,\n IamPublicConfigSchema,\n IamReauthenticateInputSchema,\n IamReauthenticationProofSchema,\n IamRefreshTokenDataSchema,\n IamRefreshTokenInputSchema,\n IamRegisterInputSchema,\n IamRenewPasswordInputSchema,\n IamRequestPasswordResetInputSchema,\n IamRoleSchema,\n IamSendOtpDataSchema,\n IamSendOtpInputSchema,\n IamUpdateCurrentUserInputSchema,\n IamUpdateRoleInputSchema,\n IamUserIdInputSchema,\n IamUserSchema,\n} from './iam-schemas.js'\n\n// 同一 contract 内被多个接口复用的输出结构保持私有,避免扩大公共 Schema 面。\nconst authResultOutputSchema = haiResultSchema(IamAuthResultSchema)\nconst userOutputSchema = haiResultSchema(IamUserSchema)\nconst roleOutputSchema = haiResultSchema(IamRoleSchema)\n\n/**\n * IAM 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.iam\n * void contract\n * ```\n */\nexport const iamContract = {\n auth: {\n createCaptcha: route({ method: 'POST', path: '/auth/captcha', operationId: 'iam.auth.createCaptcha', summary: 'Create self-hosted security challenge', tags: ['iam', 'auth'] })\n .input(IamCreateCaptchaInputSchema)\n .output(haiResultSchema(IamCaptchaChallengeSchema)),\n reauthenticate: route({ method: 'POST', path: '/auth/reauthenticate', operationId: 'iam.auth.reauthenticate', summary: 'Verify current password for one sensitive operation', tags: ['iam', 'auth'] })\n .input(IamReauthenticateInputSchema)\n .output(haiResultSchema(IamReauthenticationProofSchema)),\n publicConfig: route({ method: 'GET', path: '/auth/config', operationId: 'iam.auth.publicConfig', summary: 'Public authentication configuration', tags: ['iam', 'auth'] })\n .output(haiResultSchema(IamPublicConfigSchema.nullable())),\n renewPassword: route({ method: 'POST', path: '/auth/password/renew', operationId: 'iam.auth.renewPassword', summary: 'Change initial or expired password', tags: ['iam', 'auth'] })\n .input(IamRenewPasswordInputSchema)\n .output(HaiVoidResultSchema),\n loginWithLdap: route({ method: 'POST', path: '/auth/login/ldap', operationId: 'iam.auth.loginWithLdap', summary: 'LDAP login', tags: ['iam', 'auth'] })\n .input(IamLdapLoginInputSchema)\n .output(authResultOutputSchema),\n requestPasswordReset: route({ method: 'POST', path: '/auth/password-reset/request', operationId: 'iam.auth.requestPasswordReset', summary: 'Request password reset', tags: ['iam', 'auth'] })\n .input(IamRequestPasswordResetInputSchema)\n .output(HaiVoidResultSchema),\n confirmPasswordReset: route({ method: 'POST', path: '/auth/password-reset/confirm', operationId: 'iam.auth.confirmPasswordReset', summary: 'Confirm password reset', tags: ['iam', 'auth'] })\n .input(IamConfirmPasswordResetInputSchema)\n .output(HaiVoidResultSchema),\n login: route({ method: 'POST', path: '/auth/login', operationId: 'iam.auth.login', summary: 'Password login', tags: ['iam', 'auth'] })\n .input(IamLoginInputSchema)\n .output(authResultOutputSchema),\n loginWithOtp: route({ method: 'POST', path: '/auth/login/otp', operationId: 'iam.auth.loginWithOtp', summary: 'OTP login', tags: ['iam', 'auth'] })\n .input(IamOtpLoginInputSchema)\n .output(authResultOutputSchema),\n logout: route({ method: 'POST', path: '/auth/logout', operationId: 'iam.auth.logout', summary: 'Logout', tags: ['iam', 'auth'] })\n .input(IamLogoutInputSchema)\n .output(HaiVoidResultSchema),\n closeSession: route({ method: 'POST', path: '/auth/session/close', operationId: 'iam.auth.closeSession', summary: 'Revoke departing client session without clearing newer cookies', tags: ['iam', 'auth'] })\n .input(IamLogoutInputSchema)\n .output(HaiVoidResultSchema),\n currentUser: route({ method: 'GET', path: '/auth/me', operationId: 'iam.auth.currentUser', summary: 'Get current user and access scope', tags: ['iam', 'auth'] })\n .output(haiResultSchema(IamCurrentUserSchema)),\n refresh: route({ method: 'POST', path: '/auth/refresh', operationId: 'iam.auth.refresh', summary: 'Refresh access token', tags: ['iam', 'auth'] })\n .input(IamRefreshTokenInputSchema)\n .output(haiResultSchema(IamRefreshTokenDataSchema)),\n sendOtp: route({ method: 'POST', path: '/auth/otp/send', operationId: 'iam.auth.sendOtp', summary: 'Send OTP', tags: ['iam', 'auth'] })\n .input(IamSendOtpInputSchema)\n .output(haiResultSchema(IamSendOtpDataSchema)),\n register: route({ method: 'POST', path: '/auth/register', operationId: 'iam.auth.register', summary: 'Register and login', tags: ['iam', 'auth'] })\n .input(IamRegisterInputSchema)\n .output(authResultOutputSchema),\n changePassword: route({ method: 'POST', path: '/auth/change-password', operationId: 'iam.auth.changePassword', summary: 'Change current user password', tags: ['iam', 'auth'] })\n .input(IamChangePasswordInputSchema)\n .output(HaiVoidResultSchema),\n updateCurrentUser: route({ method: 'PUT', path: '/auth/me', operationId: 'iam.auth.updateCurrentUser', summary: 'Update current user', tags: ['iam', 'auth'] })\n .input(IamUpdateCurrentUserInputSchema)\n .output(userOutputSchema),\n },\n users: {\n invite: route({ method: 'POST', path: '/iam/users/invite', operationId: 'iam.users.invite', summary: 'Create account with one-time setup invitation', tags: ['iam', 'users'] })\n .input(IamInviteUserInputSchema)\n .output(userOutputSchema),\n list: route({ method: 'GET', path: '/iam/users', operationId: 'iam.users.list', summary: 'List users', tags: ['iam', 'users'] })\n .input(IamListUsersInputSchema)\n .output(haiResultSchema(paginatedSchema(IamUserSchema))),\n get: route({ method: 'GET', path: '/iam/users/{id}', operationId: 'iam.users.get', summary: 'Get user', tags: ['iam', 'users'] })\n .input(IamUserIdInputSchema)\n .output(haiResultSchema(IamUserSchema.nullable())),\n create: route({ method: 'POST', path: '/iam/users', operationId: 'iam.users.create', summary: 'Create user', tags: ['iam', 'users'] })\n .input(IamAdminCreateUserInputSchema)\n .output(userOutputSchema),\n update: route({ method: 'PUT', path: '/iam/users/{id}', operationId: 'iam.users.update', summary: 'Update user', tags: ['iam', 'users'] })\n .input(IamAdminUpdateUserInputSchema)\n .output(userOutputSchema),\n delete: route({ method: 'DELETE', path: '/iam/users/{id}', operationId: 'iam.users.delete', summary: 'Delete user', tags: ['iam', 'users'] })\n .input(IamUserIdInputSchema)\n .output(HaiVoidResultSchema),\n resetPassword: route({ method: 'POST', path: '/iam/users/{id}/reset-password', operationId: 'iam.users.resetPassword', summary: 'Reset user password', tags: ['iam', 'users'] })\n .input(IamAdminResetPasswordInputSchema)\n .output(HaiVoidResultSchema),\n },\n roles: {\n list: route({ method: 'GET', path: '/iam/roles', operationId: 'iam.roles.list', summary: 'List roles', tags: ['iam', 'roles'] })\n .output(haiResultSchema(paginatedSchema(IamRoleSchema))),\n get: route({ method: 'GET', path: '/iam/roles/{id}', operationId: 'iam.roles.get', summary: 'Get role', tags: ['iam', 'roles'] })\n .input(IamUserIdInputSchema)\n .output(haiResultSchema(IamRoleSchema.nullable())),\n create: route({ method: 'POST', path: '/iam/roles', operationId: 'iam.roles.create', summary: 'Create role', tags: ['iam', 'roles'] })\n .input(IamCreateRoleInputSchema)\n .output(roleOutputSchema),\n update: route({ method: 'PUT', path: '/iam/roles/{id}', operationId: 'iam.roles.update', summary: 'Update role', tags: ['iam', 'roles'] })\n .input(IamUpdateRoleInputSchema)\n .output(roleOutputSchema),\n delete: route({ method: 'DELETE', path: '/iam/roles/{id}', operationId: 'iam.roles.delete', summary: 'Delete role', tags: ['iam', 'roles'] })\n .input(IamUserIdInputSchema)\n .output(HaiVoidResultSchema),\n },\n permissions: {\n setSensitiveOperations: route({ method: 'PUT', path: '/iam/permissions/{id}/sensitive-operations', operationId: 'iam.permissions.sensitiveOperations', summary: 'Set permission sensitive operations', tags: ['iam', 'permissions'] })\n .input(IamPermissionSchema.pick({ id: true, sensitiveOperations: true }))\n .output(HaiVoidResultSchema),\n list: route({ method: 'GET', path: '/iam/permissions', operationId: 'iam.permissions.list', summary: 'List permissions', tags: ['iam', 'permissions'] })\n .input(IamListPermissionsInputSchema)\n .output(haiResultSchema(paginatedSchema(IamPermissionSchema))),\n get: route({ method: 'GET', path: '/iam/permissions/{id}', operationId: 'iam.permissions.get', summary: 'Get permission', tags: ['iam', 'permissions'] })\n .input(IamUserIdInputSchema)\n .output(haiResultSchema(IamPermissionSchema.nullable())),\n create: route({ method: 'POST', path: '/iam/permissions', operationId: 'iam.permissions.create', summary: 'Create permission', tags: ['iam', 'permissions'] })\n .input(IamCreatePermissionInputSchema)\n .output(haiResultSchema(IamPermissionSchema)),\n delete: route({ method: 'DELETE', path: '/iam/permissions/{id}', operationId: 'iam.permissions.delete', summary: 'Delete permission', tags: ['iam', 'permissions'] })\n .input(IamUserIdInputSchema)\n .output(HaiVoidResultSchema),\n },\n}\n\n/**\n * iam 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { IamContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: IamContract = apiContract.iam\n * void contract\n * ```\n */\nexport type IamContract = typeof iamContract\n"]}
@@ -344,6 +344,7 @@ declare const feedbackContract: {
344
344
  type: z.ZodEnum<{
345
345
  collect: "collect";
346
346
  notify: "notify";
347
+ webhook: "webhook";
347
348
  export: "export";
348
349
  cleanup: "cleanup";
349
350
  }>;
@@ -505,6 +506,7 @@ declare const feedbackContract: {
505
506
  target: z.ZodEnum<{
506
507
  collect: "collect";
507
508
  notify: "notify";
509
+ webhook: "webhook";
508
510
  export: "export";
509
511
  attachment: "attachment";
510
512
  }>;
@@ -537,6 +539,7 @@ declare const feedbackContract: {
537
539
  type: z.ZodEnum<{
538
540
  collect: "collect";
539
541
  notify: "notify";
542
+ webhook: "webhook";
540
543
  export: "export";
541
544
  cleanup: "cleanup";
542
545
  }>;
@@ -1172,6 +1175,7 @@ declare const FeedbackRetryInputSchema: z.ZodObject<{
1172
1175
  target: z.ZodEnum<{
1173
1176
  collect: "collect";
1174
1177
  notify: "notify";
1178
+ webhook: "webhook";
1175
1179
  export: "export";
1176
1180
  attachment: "attachment";
1177
1181
  }>;
@@ -1215,6 +1219,7 @@ declare const FeedbackJobSchema: z.ZodObject<{
1215
1219
  type: z.ZodEnum<{
1216
1220
  collect: "collect";
1217
1221
  notify: "notify";
1222
+ webhook: "webhook";
1218
1223
  export: "export";
1219
1224
  cleanup: "cleanup";
1220
1225
  }>;
@@ -1335,6 +1340,7 @@ declare const FeedbackDetailSchema: z.ZodObject<{
1335
1340
  type: z.ZodEnum<{
1336
1341
  collect: "collect";
1337
1342
  notify: "notify";
1343
+ webhook: "webhook";
1338
1344
  export: "export";
1339
1345
  cleanup: "cleanup";
1340
1346
  }>;