@h-ai/api-contract 0.1.0-alpha.69 → 0.1.0-alpha.71

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.
@@ -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-JVJJOK4X.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', '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', '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"]}
@@ -1,4 +1,4 @@
1
- import { route, haiResultSchema } from './chunk-JKPLID6E.js';
1
+ import { route, haiResultSchema } from './chunk-5UEDYQLG.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  var AUDIO_WS_PATH = "/ai/audio";
@@ -245,5 +245,5 @@ var aiContract = {
245
245
  };
246
246
 
247
247
  export { AUDIO_WS_PATH, AiAssistantMessageSchema, AiChatCompletionChoiceSchema, AiChatCompletionDataSchema, AiChatCompletionInputSchema, AiChatHistoryDataSchema, AiChatHistoryInputSchema, AiChatMessageSchema, AiChatRecordSchema, AiImageContentSchema, AiMemoryEntrySchema, AiMemoryListDataSchema, AiMemoryListInputSchema, AiMemoryRecallDataSchema, AiMemoryRecallInputSchema, AiMemoryTypeSchema, AiMessageContentSchema, AiMessageRoleSchema, AiSendMessageDataSchema, AiSendMessageInputSchema, AiSessionInfoSchema, AiSessionListDataSchema, AiSessionListInputSchema, AiTextContentSchema, AiTokenUsageSchema, AiToolCallSchema, AiToolDefinitionSchema, AudioFormatSchema, AudioWsClientMessageSchema, AudioWsDoneMessageSchema, AudioWsStartMessageSchema, AudioWsTextMessageSchema, aiContract };
248
- //# sourceMappingURL=chunk-G55ATYDA.js.map
249
- //# sourceMappingURL=chunk-G55ATYDA.js.map
248
+ //# sourceMappingURL=chunk-LD5PSL4C.js.map
249
+ //# sourceMappingURL=chunk-LD5PSL4C.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/ai-audio-ws-schemas.ts","../src/ai/ai-schemas.ts","../src/ai/ai-contract.ts"],"names":["z"],"mappings":";;;AAmBO,IAAM,aAAA,GAAgB;AAYtB,IAAM,iBAAA,GAAoB,EAAE,IAAA,CAAK,CAAC,SAAS,KAAA,EAAO,KAAA,EAAO,MAAM,CAAC;AAEvE,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,eAAA,GAAkB,KAAA;AAejB,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EAChD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACvB,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAAA,EAC9C,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAO,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,qBAAqB,EAAE,QAAA,EAAS;AAAA,EACtD,UAAU,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,qBAAqB,EAAE,QAAA,EAAS;AAAA,EACzD,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,YAAY,CAAC,CAAA,CAAE,GAAA,CAAI,SAAS,EAAE,QAAA,EAAS;AAAA,EAC5E,OAAO,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,qBAAqB,EAAE,QAAA,EAAS;AAAA,EACtD,aAAa,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,qBAAqB,EAAE,QAAA,EAAS;AAAA,EAC5D,MAAA,EAAQ,kBAAkB,QAAA,EAAS;AAAA,EACnC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,eAAe,CAAA,CAAE,GAAA,CAAI,eAAe,CAAA,CAAE,QAAA,EAAS;AAAA,EAChF,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,CAAC,EAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,EAAE,QAAA;AAClD,CAAC;AAgBM,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,SAAA,EAAW,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,kBAAkB,CAAA;AAAA,EACnD,IAAA,EAAM,EAAE,MAAA;AACV,CAAC;AAcM,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM;AACxB,CAAC;AAeM,IAAM,0BAAA,GAA6B,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACrE,yBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAC;AClGM,IAAM,mBAAA,GAAsBA,EAAE,IAAA,CAAK,CAAC,UAAU,MAAA,EAAQ,WAAA,EAAa,MAAM,CAAC;AAe1E,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAMA,EAAE,MAAA;AACV,CAAC,EAAE,MAAA;AAiBI,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA,EAC3C,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,EAC3B,SAAA,EAAWA,EAAE,MAAA,CAAO;AAAA,IAClB,GAAA,EAAKA,EAAE,MAAA,EAAO;AAAA,IACd,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,QAAQ,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,QAAA;AAAS,GAClD,EAAE,MAAA;AACL,CAAC,EAAE,MAAA;AAYI,IAAM,sBAAA,GAAyBA,EAAE,KAAA,CAAM;AAAA,EAC5CA,EAAE,MAAA,EAAO;AAAA,EACTA,CAAAA,CAAE,MAAMA,CAAAA,CAAE,KAAA,CAAM,CAAC,mBAAA,EAAqB,oBAAoB,CAAC,CAAC;AAC9D,CAAC;AAmBM,IAAM,gBAAA,GAAmBA,EAAE,MAAA,CAAO;AAAA,EACvC,EAAA,EAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,QAAA,EAAUA,EAAE,MAAA,CAAO;AAAA,IACjB,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACtB,SAAA,EAAWA,EAAE,MAAA;AAAO,GACrB,EAAE,MAAA;AACL,CAAC,EAAE,MAAA;AAGH,IAAM,0BAAA,GAA6BA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAC,CAAC,CAAA;AAe9E,IAAM,mBAAA,GAAsBA,CAAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAC9DA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACxB,OAAA,EAAS,0BAAA;AAAA,IACT,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC3B,EAAE,MAAA,EAAO;AAAA,EACVA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACtB,OAAA,EAAS,sBAAA;AAAA,IACT,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC3B,EAAE,MAAA,EAAO;AAAA,EACVA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,IAC3B,OAAA,EAAS,0BAAA,CAA2B,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IACxD,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,UAAA,EAAYA,EAAE,KAAA,CAAM,gBAAgB,EAAE,GAAA,CAAI,CAAC,EAAE,QAAA;AAAS,GACvD,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,CAAA,OAAA,KAAW,OAAA,CAAQ,OAAA,IAAW,IAAA,IAAQ,OAAA,CAAQ,UAAA,KAAe,MAAS,CAAA;AAAA,EACzFA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACtB,OAAA,EAAS,0BAAA;AAAA,IACT,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AAAA,GAC/B,EAAE,MAAA;AACL,CAAC;AA6BM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,QAAA,EAAUA,EAAE,MAAA,CAAO;AAAA,IACjB,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACtB,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACjC,UAAA,EAAYA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,IAAA,EAAM,CAAA,CAAE,QAAA,EAAS;AAAA,IACpD,QAAQA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,QAAA;AAAS,GACzC,EAAE,MAAA;AACL,CAAC,EAAE,MAAA;AAmBI,IAAM,2BAAA,GAA8BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAElD,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA;AAAA,EAErC,WAAWA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACtC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,UAAUA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACzC,UAAA,EAAYA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7C,KAAA,EAAOA,EAAE,KAAA,CAAM,sBAAsB,EAAE,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACvD,WAAA,EAAaA,EAAE,KAAA,CAAM;AAAA,IACnBA,CAAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,IAChBA,CAAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,IAChBA,CAAAA,CAAE,QAAQ,UAAU,CAAA;AAAA,IACpBA,CAAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAMA,CAAAA,CAAE,QAAQ,UAAU,CAAA,EAAG,QAAA,EAAUA,CAAAA,CAAE,MAAA,CAAO,EAAE,MAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO,EAAG,CAAA,CAAE,MAAA;AAAO,GAC5G,EAAE,QAAA;AACL,CAAC,EAAE,MAAA,EAAO,CAAE,WAAA,CAAY,CAAC,OAAO,OAAA,KAAY;AAC1C,EAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,CAAC,KAAA,CAAM,KAAA,EAAO,MAAA;AACzC,IAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,aAAa,GAAG,CAAA;AAC5D,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,MAAA,CAAO,SAAS,IAAI,CAAA;AACtG,IAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,aAAa,GAAG,CAAA;AAC9D,CAAC;AAgBM,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,aAAA,EAAeA,EAAE,MAAA,EAAO;AAAA,EACxB,iBAAA,EAAmBA,EAAE,MAAA,EAAO;AAAA,EAC5B,YAAA,EAAcA,EAAE,MAAA;AAClB,CAAC;AAeM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,EAC3B,SAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACxC,UAAA,EAAYA,CAAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA;AACxC,CAAC;AAmBM,IAAM,4BAAA,GAA+BA,EAAE,MAAA,CAAO;AAAA,EACnD,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAAS,wBAAA;AAAA,EACT,aAAA,EAAeA,EAAE,IAAA,CAAK,CAAC,QAAQ,QAAA,EAAU,YAAA,EAAc,gBAAgB,CAAC;AAC1E,CAAC;AAgCM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,MAAA,EAAQA,CAAAA,CAAE,OAAA,CAAQ,iBAAiB,CAAA;AAAA,EACnC,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAM,4BAA4B,CAAA;AAAA,EAC7C,KAAA,EAAO;AACT,CAAC;AAcM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE/C,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA;AAAA,EAErC,WAAWA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACtC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA;AACxC,CAAC;AAeM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,KAAA,EAAO,mBAAmB,QAAA;AAC5B,CAAC;AAYM,IAAM,kBAAA,GAAqBA,EAAE,IAAA,CAAK,CAAC,QAAQ,YAAA,EAAc,OAAA,EAAS,QAAA,EAAU,aAAa,CAAC;AAoB1F,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAM,kBAAA;AAAA,EACN,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,EACzB,WAAA,EAAaA,EAAE,MAAA;AACjB,CAAC;AAcM,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EAChD,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,IAAA,EAAMA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACvC,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAM,kBAAkB,EAAE,QAAA,EAAS;AAAA,EAC5C,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA;AAC9B,CAAC;AAwBM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAM,mBAAmB;AACpC,CAAC;AAYM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAM,kBAAkB,EAAE,QAAA,EAAS;AAAA,EAC5C,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACrC,MAAA,EAAQA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACzC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC1C,CAAC;AAyBM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA;AAAA,EAClC,KAAA,EAAOA,EAAE,MAAA;AACX,CAAC;AAiBM,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,QAAA,EAAUA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC9C,CAAC;AAYM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE/C,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA;AAC9B,CAAC;AAqBM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAM,mBAAmB;AACpC,CAAC;AAoCM,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,OAAA,EAASA,EAAE,MAAA,CAAO;AAAA,IAChB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,IAChB,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAM,mBAAmB;AAAA,GACtC,CAAA;AAAA,EACD,QAAA,EAAUA,EAAE,MAAA,CAAO;AAAA,IACjB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,IAClB,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA,EAAS;AAAA,IAC9C,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,IACvB,KAAA,EAAO;AAAA,GACR,CAAA;AAAA,EACD,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,QAAA,EAAUA,EAAE,MAAA;AACd,CAAC;AAcM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE/C,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACrC,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,KAAA,EAAOA,EAAE,IAAA,CAAK,CAAC,OAAO,MAAM,CAAC,EAAE,QAAA;AACjC,CAAC;AAwCM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAM,kBAAkB;AACnC,CAAC;;;AC7nBM,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,gBAAA,EAAkB,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,uBAAA,EAAyB,WAAA,EAAa,2BAAA,EAA6B,OAAA,EAAS,0DAAA,EAA4D,IAAA,EAAM,CAAC,IAAA,EAAM,OAAO,CAAA,EAAG,CAAA,CAC5M,KAAA,CAAM,2BAA2B,CAAA,CACjC,MAAA,CAAO,eAAA,CAAgB,0BAA0B,CAAC,CAAA;AAAA,IACrD,WAAA,EAAa,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,oBAAA,EAAsB,WAAA,EAAa,sBAAA,EAAwB,OAAA,EAAS,4BAAA,EAA8B,IAAA,EAAM,CAAC,IAAA,EAAM,OAAO,CAAA,EAAG,CAAA,CACjK,KAAA,CAAM,wBAAwB,CAAA,CAC9B,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAC,CAAA;AAAA,IAClD,WAAA,EAAa,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,mBAAA,EAAqB,WAAA,EAAa,sBAAA,EAAwB,OAAA,EAAS,mBAAA,EAAqB,IAAA,EAAM,CAAC,IAAA,EAAM,OAAO,CAAA,EAAG,CAAA,CACvJ,KAAA,CAAM,wBAAwB,CAAA,CAC9B,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAC;AAAA,GACpD;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,qBAAA,EAAuB,WAAA,EAAa,oBAAA,EAAsB,OAAA,EAAS,0BAAA,EAA4B,IAAA,EAAM,CAAC,IAAA,EAAM,UAAU,CAAA,EAAG,CAAA,CAC5J,KAAA,CAAM,yBAAyB,CAAA,CAC/B,MAAA,CAAO,eAAA,CAAgB,wBAAwB,CAAC,CAAA;AAAA,IACnD,IAAA,EAAM,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,mBAAA,EAAqB,WAAA,EAAa,kBAAA,EAAoB,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,CAAC,IAAA,EAAM,UAAU,CAAA,EAAG,CAAA,CAC3I,KAAA,CAAM,uBAAuB,CAAA,CAC7B,MAAA,CAAO,eAAA,CAAgB,sBAAsB,CAAC;AAAA,GACnD;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,mBAAA,EAAqB,WAAA,EAAa,kBAAA,EAAoB,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,CAAC,IAAA,EAAM,UAAU,CAAA,EAAG,CAAA,CAC3I,KAAA,CAAM,wBAAwB,CAAA,CAC9B,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAC;AAAA;AAEtD","file":"chunk-G55ATYDA.js","sourcesContent":["/**\n * Audio WebSocket 传输协议的运行时 Schema。\n *\n * 该协议同时被 AI 客户端与 Serv 服务端消费,因此由 api-contract 维护单一事实源,\n * 避免 Serv 根入口为了校验可选 Audio 消息而静态加载整个 `@h-ai/ai` 包。\n */\nimport { z } from 'zod'\n\n/**\n * 统一语音入口的默认路径(相对 API 前缀)。\n * @example\n * ```ts\n * import { AUDIO_WS_PATH } from '@h-ai/api-contract'\n *\n * const endpoint = new URL(AUDIO_WS_PATH, 'https://api.example.com')\n * endpoint.protocol = 'wss:'\n * void endpoint\n * ```\n */\nexport const AUDIO_WS_PATH = '/ai/audio'\n\n/**\n * 合法音频格式。\n * @example\n * ```ts\n * import { AudioFormatSchema } from '@h-ai/api-contract'\n *\n * const value = AudioFormatSchema.parse('pcm16')\n * void value\n * ```\n */\nexport const AudioFormatSchema = z.enum(['pcm16', 'wav', 'mp3', 'opus'])\n\nconst MAX_CONTROL_FIELD_LEN = 512\nconst MAX_HINT_LEN = 256\nconst MAX_HINTS = 64\nconst MAX_SEGMENT_ID_LEN = 128\nconst MIN_SAMPLE_RATE = 8000\nconst MAX_SAMPLE_RATE = 192000\n\n/**\n * 会话起始帧 Schema。\n * @example\n * ```ts\n * import { AudioWsStartMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsStartMessageSchema.parse({\n * type: 'start',\n * operation: 'transcribe'\n * })\n * void value\n * ```\n */\nexport const AudioWsStartMessageSchema = z.object({\n type: z.literal('start'),\n operation: z.enum(['transcribe', 'synthesize']),\n stream: z.boolean().optional(),\n model: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n language: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n contextHints: z.array(z.string().max(MAX_HINT_LEN)).max(MAX_HINTS).optional(),\n voice: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n instruction: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n format: AudioFormatSchema.optional(),\n sampleRate: z.number().int().min(MIN_SAMPLE_RATE).max(MAX_SAMPLE_RATE).optional(),\n channels: z.union([z.literal(1), z.literal(2)]).optional(),\n})\n\n/**\n * 文本输入帧 Schema。\n * @example\n * ```ts\n * import { AudioWsTextMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsTextMessageSchema.parse({\n * type: 'text',\n * segmentId: 'example',\n * text: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AudioWsTextMessageSchema = z.object({\n type: z.literal('text'),\n segmentId: z.string().min(1).max(MAX_SEGMENT_ID_LEN),\n text: z.string(),\n})\n\n/**\n * 输入结束帧 Schema。\n * @example\n * ```ts\n * import { AudioWsDoneMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsDoneMessageSchema.parse({\n * type: 'done'\n * })\n * void value\n * ```\n */\nexport const AudioWsDoneMessageSchema = z.object({\n type: z.literal('done'),\n})\n\n/**\n * 客户端 JSON 控制消息 Schema。\n * @example\n * ```ts\n * import { AudioWsClientMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsClientMessageSchema.parse({\n * type: 'start',\n * operation: 'transcribe'\n * })\n * void value\n * ```\n */\nexport const AudioWsClientMessageSchema = z.discriminatedUnion('type', [\n AudioWsStartMessageSchema,\n AudioWsTextMessageSchema,\n AudioWsDoneMessageSchema,\n])\n","/**\n * @h-ai/api-contract — AI 领域 Schema\n *\n * 包含聊天补全、消息占位、记忆召回与历史会话相关的 input/output Zod Schema。\n * 默认聊天补全为非流式 JSON,支持 function tool calling;未声明字段在边界拒绝。\n * 仅保留跨接口、跨层复用的数据结构;一次性输出包装在 contract 中内联。\n * @module ai-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { z } from 'zod'\n\n/**\n * 消息角色 Schema。\n * @example\n * ```ts\n * import { AiMessageRoleSchema } from '@h-ai/api-contract'\n *\n * const value = AiMessageRoleSchema.parse('system')\n * void value\n * ```\n */\nexport const AiMessageRoleSchema = z.enum(['system', 'user', 'assistant', 'tool'])\n\n/**\n * 文本内容 Schema。\n * @example\n * ```ts\n * import { AiTextContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiTextContentSchema.parse({\n * type: 'text',\n * text: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiTextContentSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).strict()\n\n/**\n * 图片内容 Schema。\n * @example\n * ```ts\n * import { AiImageContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiImageContentSchema.parse({\n * type: 'image_url',\n * image_url: {\n * url: 'https://example.com/resource'\n * }\n * })\n * void value\n * ```\n */\nexport const AiImageContentSchema = z.object({\n type: z.literal('image_url'),\n image_url: z.object({\n url: z.string(),\n detail: z.enum(['auto', 'low', 'high']).optional(),\n }).strict(),\n}).strict()\n\n/**\n * 消息内容 Schema。\n * @example\n * ```ts\n * import { AiMessageContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiMessageContentSchema.parse('example')\n * void value\n * ```\n */\nexport const AiMessageContentSchema = z.union([\n z.string(),\n z.array(z.union([AiTextContentSchema, AiImageContentSchema])),\n])\n\n/**\n * 工具调用 Schema。\n * @example\n * ```ts\n * import { AiToolCallSchema } from '@h-ai/api-contract'\n *\n * const value = AiToolCallSchema.parse({\n * id: 'call_1',\n * type: 'function',\n * function: {\n * name: 'lookupOrder',\n * arguments: '{\\'id\\':\\'order_1\\'}'\n * }\n * })\n * void value\n * ```\n */\nexport const AiToolCallSchema = z.object({\n id: z.string().min(1),\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n arguments: z.string(),\n }).strict(),\n}).strict()\n\n/** system、assistant 和 tool 只接收文本,不把图片 URL 静默转换为文本。 */\nconst AiTextMessageContentSchema = z.union([z.string(), z.array(AiTextContentSchema)])\n\n/**\n * 按角色校验聊天消息;工具结果必须携带非空 tool_call_id。\n * @example\n * ```ts\n * import { AiChatMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatMessageSchema.parse({\n * role: 'system',\n * content: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiChatMessageSchema = z.discriminatedUnion('role', [\n z.object({\n role: z.literal('system'),\n content: AiTextMessageContentSchema,\n name: z.string().optional(),\n }).strict(),\n z.object({\n role: z.literal('user'),\n content: AiMessageContentSchema,\n name: z.string().optional(),\n }).strict(),\n z.object({\n role: z.literal('assistant'),\n content: AiTextMessageContentSchema.nullable().optional(),\n name: z.string().optional(),\n tool_calls: z.array(AiToolCallSchema).min(1).optional(),\n }).strict().refine(message => message.content != null || message.tool_calls !== undefined),\n z.object({\n role: z.literal('tool'),\n content: AiTextMessageContentSchema,\n tool_call_id: z.string().min(1),\n }).strict(),\n])\n\n/**\n * 完整的 function 工具定义;parameters 保留嵌套 JSON Schema,不裁剪其关键字。\n * @example\n * ```ts\n * import { AiToolDefinitionSchema } from '@h-ai/api-contract'\n *\n * const value = AiToolDefinitionSchema.parse({\n * type: 'function',\n * function: {\n * name: 'lookupOrder',\n * description: 'Look up an order',\n * parameters: {\n * type: 'object',\n * properties: {\n * id: {\n * type: 'string'\n * }\n * },\n * required: [\n * 'id'\n * ]\n * }\n * }\n * })\n * void value\n * ```\n */\nexport const AiToolDefinitionSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n parameters: z.record(z.string(), z.json()).optional(),\n strict: z.boolean().nullable().optional(),\n }).strict(),\n}).strict()\n\n/**\n * 非流式聊天补全入参;stream 等未声明字段明确拒绝。\n * @example\n * ```ts\n * import { AiChatCompletionInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionInputSchema.parse({\n * messages: [\n * {\n * role: 'user',\n * content: 'Say hello'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionInputSchema = z.object({\n /** 默认绑定认证用户;跨主体访问需服务端显式授权。 */\n objectId: z.string().min(1).optional(),\n /** 用户主体内的会话 ID,省略时为 default。 */\n sessionId: z.string().min(1).optional(),\n model: z.string().optional(),\n messages: z.array(AiChatMessageSchema).min(1),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n max_tokens: z.number().int().min(1).optional(),\n tools: z.array(AiToolDefinitionSchema).min(1).optional(),\n tool_choice: z.union([\n z.literal('auto'),\n z.literal('none'),\n z.literal('required'),\n z.object({ type: z.literal('function'), function: z.object({ name: z.string().min(1) }).strict() }).strict(),\n ]).optional(),\n}).strict().superRefine((input, context) => {\n const choice = input.tool_choice\n if (choice === 'required' && !input.tools?.length)\n context.addIssue({ code: 'custom', path: ['tool_choice'] })\n if (typeof choice === 'object' && !input.tools?.some(tool => tool.function.name === choice.function.name))\n context.addIssue({ code: 'custom', path: ['tool_choice'] })\n})\n\n/**\n * Token 使用统计 Schema。\n * @example\n * ```ts\n * import { AiTokenUsageSchema } from '@h-ai/api-contract'\n *\n * const value = AiTokenUsageSchema.parse({\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * })\n * void value\n * ```\n */\nexport const AiTokenUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n})\n\n/**\n * 助手消息 Schema。\n * @example\n * ```ts\n * import { AiAssistantMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AiAssistantMessageSchema.parse({\n * role: 'assistant',\n * content: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.string().nullable().optional(),\n tool_calls: z.array(AiToolCallSchema).optional(),\n})\n\n/**\n * 聊天完成选择 Schema。\n * @example\n * ```ts\n * import { AiChatCompletionChoiceSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionChoiceSchema.parse({\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: AiAssistantMessageSchema,\n finish_reason: z.enum(['stop', 'length', 'tool_calls', 'content_filter']),\n})\n\n/**\n * 聊天完成业务数据 Schema。\n * @example\n * ```ts\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionDataSchema = z.object({\n id: z.string(),\n object: z.literal('chat.completion'),\n created: z.number(),\n model: z.string(),\n choices: z.array(AiChatCompletionChoiceSchema),\n usage: AiTokenUsageSchema,\n})\n\n/**\n * 简单消息入参 Schema。\n * @example\n * ```ts\n * import { AiSendMessageInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiSendMessageInputSchema.parse({\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport const AiSendMessageInputSchema = z.object({\n /** 默认绑定认证用户;跨主体访问需服务端显式授权。 */\n objectId: z.string().min(1).optional(),\n /** 用户主体内的会话 ID,省略时为 default。 */\n sessionId: z.string().min(1).optional(),\n message: z.string().min(1),\n systemPrompt: z.string().optional(),\n model: z.string().optional(),\n temperature: z.number().min(0).max(2).optional(),\n})\n\n/**\n * 简单消息业务数据 Schema。\n * @example\n * ```ts\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * })\n * void value\n * ```\n */\nexport const AiSendMessageDataSchema = z.object({\n content: z.string(),\n model: z.string(),\n usage: AiTokenUsageSchema.optional(),\n})\n\n/**\n * 记忆类型 Schema。\n * @example\n * ```ts\n * import { AiMemoryTypeSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryTypeSchema.parse('fact')\n * void value\n * ```\n */\nexport const AiMemoryTypeSchema = z.enum(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/**\n * 记忆条目 Schema。\n * @example\n * ```ts\n * import { AiMemoryEntrySchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryEntrySchema.parse({\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * })\n * void value\n * ```\n */\nexport const AiMemoryEntrySchema = z.object({\n id: z.string(),\n content: z.string(),\n type: AiMemoryTypeSchema,\n importance: z.number(),\n objectId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.number(),\n lastAccessedAt: z.number(),\n accessCount: z.number(),\n})\n\n/**\n * 记忆检索入参 Schema。\n * @example\n * ```ts\n * import { AiMemoryRecallInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryRecallInputSchema.parse({\n * query: 'example'\n * })\n * void value\n * ```\n */\nexport const AiMemoryRecallInputSchema = z.object({\n query: z.string().min(1),\n topK: z.number().int().min(1).optional(),\n types: z.array(AiMemoryTypeSchema).optional(),\n minImportance: z.number().min(0).max(1).optional(),\n objectId: z.string().min(1).optional(),\n})\n\n/**\n * 记忆检索业务数据 Schema。\n * @example\n * ```ts\n * import { AiMemoryRecallDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryRecallDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiMemoryRecallDataSchema = z.object({\n items: z.array(AiMemoryEntrySchema),\n})\n\n/**\n * 记忆列表入参 Schema。\n * @example\n * ```ts\n * import { AiMemoryListInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryListInputSchema.parse({})\n * void value\n * ```\n */\nexport const AiMemoryListInputSchema = z.object({\n types: z.array(AiMemoryTypeSchema).optional(),\n objectId: z.string().min(1).optional(),\n offset: z.number().int().min(0).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n})\n\n/**\n * 记忆列表业务数据 Schema。\n * @example\n * ```ts\n * import { AiMemoryListDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryListDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * }\n * ],\n * total: 0\n * })\n * void value\n * ```\n */\nexport const AiMemoryListDataSchema = z.object({\n items: z.array(AiMemoryEntrySchema),\n total: z.number(),\n})\n\n/**\n * 会话信息 Schema。\n * @example\n * ```ts\n * import { AiSessionInfoSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionInfoSchema.parse({\n * objectId: 'example',\n * sessionId: 'example',\n * createdAt: 0,\n * updatedAt: 0\n * })\n * void value\n * ```\n */\nexport const AiSessionInfoSchema = z.object({\n objectId: z.string(),\n sessionId: z.string(),\n createdAt: z.number(),\n updatedAt: z.number(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * 会话列表入参 Schema。\n * @example\n * ```ts\n * import { AiSessionListInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionListInputSchema.parse({})\n * void value\n * ```\n */\nexport const AiSessionListInputSchema = z.object({\n /** 省略时由服务端绑定认证用户,不能据客户端参数推断身份。 */\n objectId: z.string().min(1).optional(),\n})\n\n/**\n * 会话列表业务数据 Schema。\n * @example\n * ```ts\n * import { AiSessionListDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionListDataSchema.parse({\n * items: [\n * {\n * objectId: 'example',\n * sessionId: 'example',\n * createdAt: 0,\n * updatedAt: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiSessionListDataSchema = z.object({\n items: z.array(AiSessionInfoSchema),\n})\n\n/**\n * 对话记录 Schema。\n * @example\n * ```ts\n * import { AiChatRecordSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatRecordSchema.parse({\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * })\n * void value\n * ```\n */\nexport const AiChatRecordSchema = z.object({\n id: z.string(),\n objectId: z.string(),\n sessionId: z.string(),\n request: z.object({\n model: z.string(),\n messages: z.array(AiChatMessageSchema),\n }),\n response: z.object({\n content: z.string(),\n toolCalls: z.array(AiToolCallSchema).optional(),\n finishReason: z.string(),\n usage: AiTokenUsageSchema,\n }),\n createdAt: z.number(),\n duration: z.number(),\n})\n\n/**\n * 对话历史入参 Schema。\n * @example\n * ```ts\n * import { AiChatHistoryInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatHistoryInputSchema.parse({\n * sessionId: 'example'\n * })\n * void value\n * ```\n */\nexport const AiChatHistoryInputSchema = z.object({\n /** 省略时由服务端绑定认证用户,跨主体访问需显式授权。 */\n objectId: z.string().min(1).optional(),\n sessionId: z.string().min(1),\n limit: z.number().int().min(1).max(200).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n})\n\n/**\n * 对话历史业务数据 Schema。\n * @example\n * ```ts\n * import { AiChatHistoryDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatHistoryDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiChatHistoryDataSchema = z.object({\n items: z.array(AiChatRecordSchema),\n})\n\n/**\n * 聊天补全请求,含消息、模型和生成参数。\n * @example\n * ```ts\n * import type { AiChatCompletionInput } from '@h-ai/api-contract'\n * import { AiChatCompletionInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatCompletionInput = AiChatCompletionInputSchema.parse({\n * messages: [\n * {\n * role: 'user',\n * content: 'Say hello'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport type AiChatCompletionInput = z.infer<typeof AiChatCompletionInputSchema>\n/**\n * 聊天补全业务数据,含候选消息与用量。\n * @example\n * ```ts\n * import type { AiChatCompletionData } from '@h-ai/api-contract'\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatCompletionData = AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * })\n * void value\n * ```\n */\nexport type AiChatCompletionData = z.infer<typeof AiChatCompletionDataSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 AiChatCompletionOutput 响应。\n * @example\n * ```ts\n * import type { AiChatCompletionOutput } from '@h-ai/api-contract'\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: AiChatCompletionOutput = ok(AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type AiChatCompletionOutput = HaiResult<AiChatCompletionData>\n/**\n * 会话消息发送请求。\n * @example\n * ```ts\n * import type { AiSendMessageInput } from '@h-ai/api-contract'\n * import { AiSendMessageInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiSendMessageInput = AiSendMessageInputSchema.parse({\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport type AiSendMessageInput = z.infer<typeof AiSendMessageInputSchema>\n/**\n * 会话消息写入后的业务数据。\n * @example\n * ```ts\n * import type { AiSendMessageData } from '@h-ai/api-contract'\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n *\n * const value: AiSendMessageData = AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * })\n * void value\n * ```\n */\nexport type AiSendMessageData = z.infer<typeof AiSendMessageDataSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 AiSendMessageOutput 响应。\n * @example\n * ```ts\n * import type { AiSendMessageOutput } from '@h-ai/api-contract'\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: AiSendMessageOutput = ok(AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type AiSendMessageOutput = HaiResult<AiSendMessageData>\n/**\n * 按主体和条件检索记忆的请求。\n * @example\n * ```ts\n * import type { AiMemoryRecallInput } from '@h-ai/api-contract'\n * import { AiMemoryRecallInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiMemoryRecallInput = AiMemoryRecallInputSchema.parse({\n * query: 'example'\n * })\n * void value\n * ```\n */\nexport type AiMemoryRecallInput = z.infer<typeof AiMemoryRecallInputSchema>\n/**\n * 按主体查询记忆列表的分页请求。\n * @example\n * ```ts\n * import type { AiMemoryListInput } from '@h-ai/api-contract'\n * import { AiMemoryListInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiMemoryListInput = AiMemoryListInputSchema.parse({})\n * void value\n * ```\n */\nexport type AiMemoryListInput = z.infer<typeof AiMemoryListInputSchema>\n/**\n * 按主体列出会话的分页请求。\n * @example\n * ```ts\n * import type { AiSessionListInput } from '@h-ai/api-contract'\n * import { AiSessionListInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiSessionListInput = AiSessionListInputSchema.parse({})\n * void value\n * ```\n */\nexport type AiSessionListInput = z.infer<typeof AiSessionListInputSchema>\n/**\n * 读取指定会话历史的请求。\n * @example\n * ```ts\n * import type { AiChatHistoryInput } from '@h-ai/api-contract'\n * import { AiChatHistoryInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatHistoryInput = AiChatHistoryInputSchema.parse({\n * sessionId: 'example'\n * })\n * void value\n * ```\n */\nexport type AiChatHistoryInput = z.infer<typeof AiChatHistoryInputSchema>\n/**\n * 会话持久化消息记录。\n * @example\n * ```ts\n * import type { AiChatRecord } from '@h-ai/api-contract'\n * import { AiChatRecordSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatRecord = AiChatRecordSchema.parse({\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * })\n * void value\n * ```\n */\nexport type AiChatRecord = z.infer<typeof AiChatRecordSchema>\n","/**\n * @h-ai/api-contract — AI 领域 contract\n *\n * 定义 AI 功能相关 API 的接口边界:聊天补全、记忆管理与会话管理。\n * 聊天补全使用 OpenAI 兼容结构(`messages` 数组 + `choices` 数组)。\n * 所有接口均需 Bearer Token 认证(由 `@h-ai/serv` 的 feature 层强制)。\n * 默认绑定认证用户的 objectId;其它主体和会话的访问须经过服务端资源授权。\n * @module ai-contract\n */\n\nimport { haiResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n AiChatCompletionDataSchema,\n AiChatCompletionInputSchema,\n AiChatHistoryDataSchema,\n AiChatHistoryInputSchema,\n AiMemoryListDataSchema,\n AiMemoryListInputSchema,\n AiMemoryRecallDataSchema,\n AiMemoryRecallInputSchema,\n AiSendMessageDataSchema,\n AiSendMessageInputSchema,\n AiSessionListDataSchema,\n AiSessionListInputSchema,\n} from './ai-schemas.js'\n\n/**\n * AI 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.ai\n * void contract\n * ```\n */\nexport const aiContract = {\n chats: {\n createCompletion: route({ method: 'POST', path: '/ai/chats/completions', operationId: 'ai.chats.createCompletion', summary: 'Create non-streaming chat completion with function tools', tags: ['ai', 'chats'] })\n .input(AiChatCompletionInputSchema)\n .output(haiResultSchema(AiChatCompletionDataSchema)),\n sendMessage: route({ method: 'POST', path: '/ai/chats/messages', operationId: 'ai.chats.sendMessage', summary: 'Send a single chat message', tags: ['ai', 'chats'] })\n .input(AiSendMessageInputSchema)\n .output(haiResultSchema(AiSendMessageDataSchema)),\n listHistory: route({ method: 'POST', path: '/ai/chats/history', operationId: 'ai.chats.listHistory', summary: 'List chat history', tags: ['ai', 'chats'] })\n .input(AiChatHistoryInputSchema)\n .output(haiResultSchema(AiChatHistoryDataSchema)),\n },\n memories: {\n recall: route({ method: 'POST', path: '/ai/memories/recall', operationId: 'ai.memories.recall', summary: 'Recall relevant memories', tags: ['ai', 'memories'] })\n .input(AiMemoryRecallInputSchema)\n .output(haiResultSchema(AiMemoryRecallDataSchema)),\n list: route({ method: 'POST', path: '/ai/memories/list', operationId: 'ai.memories.list', summary: 'List memories', tags: ['ai', 'memories'] })\n .input(AiMemoryListInputSchema)\n .output(haiResultSchema(AiMemoryListDataSchema)),\n },\n sessions: {\n list: route({ method: 'POST', path: '/ai/sessions/list', operationId: 'ai.sessions.list', summary: 'List sessions', tags: ['ai', 'sessions'] })\n .input(AiSessionListInputSchema)\n .output(haiResultSchema(AiSessionListDataSchema)),\n },\n}\n\n/**\n * ai 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { AiContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: AiContract = apiContract.ai\n * void contract\n * ```\n */\nexport type AiContract = typeof aiContract\n"]}
1
+ {"version":3,"sources":["../src/ai/ai-audio-ws-schemas.ts","../src/ai/ai-schemas.ts","../src/ai/ai-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-LD5PSL4C.js","sourcesContent":["/**\n * Audio WebSocket 传输协议的运行时 Schema。\n *\n * 该协议同时被 AI 客户端与 Serv 服务端消费,因此由 api-contract 维护单一事实源,\n * 避免 Serv 根入口为了校验可选 Audio 消息而静态加载整个 `@h-ai/ai` 包。\n */\nimport { z } from 'zod'\n\n/**\n * 统一语音入口的默认路径(相对 API 前缀)。\n * @example\n * ```ts\n * import { AUDIO_WS_PATH } from '@h-ai/api-contract'\n *\n * const endpoint = new URL(AUDIO_WS_PATH, 'https://api.example.com')\n * endpoint.protocol = 'wss:'\n * void endpoint\n * ```\n */\nexport const AUDIO_WS_PATH = '/ai/audio'\n\n/**\n * 合法音频格式。\n * @example\n * ```ts\n * import { AudioFormatSchema } from '@h-ai/api-contract'\n *\n * const value = AudioFormatSchema.parse('pcm16')\n * void value\n * ```\n */\nexport const AudioFormatSchema = z.enum(['pcm16', 'wav', 'mp3', 'opus'])\n\nconst MAX_CONTROL_FIELD_LEN = 512\nconst MAX_HINT_LEN = 256\nconst MAX_HINTS = 64\nconst MAX_SEGMENT_ID_LEN = 128\nconst MIN_SAMPLE_RATE = 8000\nconst MAX_SAMPLE_RATE = 192000\n\n/**\n * 会话起始帧 Schema。\n * @example\n * ```ts\n * import { AudioWsStartMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsStartMessageSchema.parse({\n * type: 'start',\n * operation: 'transcribe'\n * })\n * void value\n * ```\n */\nexport const AudioWsStartMessageSchema = z.object({\n type: z.literal('start'),\n operation: z.enum(['transcribe', 'synthesize']),\n stream: z.boolean().optional(),\n model: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n language: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n contextHints: z.array(z.string().max(MAX_HINT_LEN)).max(MAX_HINTS).optional(),\n voice: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n instruction: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n format: AudioFormatSchema.optional(),\n sampleRate: z.number().int().min(MIN_SAMPLE_RATE).max(MAX_SAMPLE_RATE).optional(),\n channels: z.union([z.literal(1), z.literal(2)]).optional(),\n})\n\n/**\n * 文本输入帧 Schema。\n * @example\n * ```ts\n * import { AudioWsTextMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsTextMessageSchema.parse({\n * type: 'text',\n * segmentId: 'example',\n * text: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AudioWsTextMessageSchema = z.object({\n type: z.literal('text'),\n segmentId: z.string().min(1).max(MAX_SEGMENT_ID_LEN),\n text: z.string(),\n})\n\n/**\n * 输入结束帧 Schema。\n * @example\n * ```ts\n * import { AudioWsDoneMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsDoneMessageSchema.parse({\n * type: 'done'\n * })\n * void value\n * ```\n */\nexport const AudioWsDoneMessageSchema = z.object({\n type: z.literal('done'),\n})\n\n/**\n * 客户端 JSON 控制消息 Schema。\n * @example\n * ```ts\n * import { AudioWsClientMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsClientMessageSchema.parse({\n * type: 'start',\n * operation: 'transcribe'\n * })\n * void value\n * ```\n */\nexport const AudioWsClientMessageSchema = z.discriminatedUnion('type', [\n AudioWsStartMessageSchema,\n AudioWsTextMessageSchema,\n AudioWsDoneMessageSchema,\n])\n","/**\n * @h-ai/api-contract — AI 领域 Schema\n *\n * 包含聊天补全、消息占位、记忆召回与历史会话相关的 input/output Zod Schema。\n * 默认聊天补全为非流式 JSON,支持 function tool calling;未声明字段在边界拒绝。\n * 仅保留跨接口、跨层复用的数据结构;一次性输出包装在 contract 中内联。\n * @module ai-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { z } from 'zod'\n\n/**\n * 消息角色 Schema。\n * @example\n * ```ts\n * import { AiMessageRoleSchema } from '@h-ai/api-contract'\n *\n * const value = AiMessageRoleSchema.parse('system')\n * void value\n * ```\n */\nexport const AiMessageRoleSchema = z.enum(['system', 'user', 'assistant', 'tool'])\n\n/**\n * 文本内容 Schema。\n * @example\n * ```ts\n * import { AiTextContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiTextContentSchema.parse({\n * type: 'text',\n * text: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiTextContentSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).strict()\n\n/**\n * 图片内容 Schema。\n * @example\n * ```ts\n * import { AiImageContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiImageContentSchema.parse({\n * type: 'image_url',\n * image_url: {\n * url: 'https://example.com/resource'\n * }\n * })\n * void value\n * ```\n */\nexport const AiImageContentSchema = z.object({\n type: z.literal('image_url'),\n image_url: z.object({\n url: z.string(),\n detail: z.enum(['auto', 'low', 'high']).optional(),\n }).strict(),\n}).strict()\n\n/**\n * 消息内容 Schema。\n * @example\n * ```ts\n * import { AiMessageContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiMessageContentSchema.parse('example')\n * void value\n * ```\n */\nexport const AiMessageContentSchema = z.union([\n z.string(),\n z.array(z.union([AiTextContentSchema, AiImageContentSchema])),\n])\n\n/**\n * 工具调用 Schema。\n * @example\n * ```ts\n * import { AiToolCallSchema } from '@h-ai/api-contract'\n *\n * const value = AiToolCallSchema.parse({\n * id: 'call_1',\n * type: 'function',\n * function: {\n * name: 'lookupOrder',\n * arguments: '{\\'id\\':\\'order_1\\'}'\n * }\n * })\n * void value\n * ```\n */\nexport const AiToolCallSchema = z.object({\n id: z.string().min(1),\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n arguments: z.string(),\n }).strict(),\n}).strict()\n\n/** system、assistant 和 tool 只接收文本,不把图片 URL 静默转换为文本。 */\nconst AiTextMessageContentSchema = z.union([z.string(), z.array(AiTextContentSchema)])\n\n/**\n * 按角色校验聊天消息;工具结果必须携带非空 tool_call_id。\n * @example\n * ```ts\n * import { AiChatMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatMessageSchema.parse({\n * role: 'system',\n * content: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiChatMessageSchema = z.discriminatedUnion('role', [\n z.object({\n role: z.literal('system'),\n content: AiTextMessageContentSchema,\n name: z.string().optional(),\n }).strict(),\n z.object({\n role: z.literal('user'),\n content: AiMessageContentSchema,\n name: z.string().optional(),\n }).strict(),\n z.object({\n role: z.literal('assistant'),\n content: AiTextMessageContentSchema.nullable().optional(),\n name: z.string().optional(),\n tool_calls: z.array(AiToolCallSchema).min(1).optional(),\n }).strict().refine(message => message.content != null || message.tool_calls !== undefined),\n z.object({\n role: z.literal('tool'),\n content: AiTextMessageContentSchema,\n tool_call_id: z.string().min(1),\n }).strict(),\n])\n\n/**\n * 完整的 function 工具定义;parameters 保留嵌套 JSON Schema,不裁剪其关键字。\n * @example\n * ```ts\n * import { AiToolDefinitionSchema } from '@h-ai/api-contract'\n *\n * const value = AiToolDefinitionSchema.parse({\n * type: 'function',\n * function: {\n * name: 'lookupOrder',\n * description: 'Look up an order',\n * parameters: {\n * type: 'object',\n * properties: {\n * id: {\n * type: 'string'\n * }\n * },\n * required: [\n * 'id'\n * ]\n * }\n * }\n * })\n * void value\n * ```\n */\nexport const AiToolDefinitionSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n parameters: z.record(z.string(), z.json()).optional(),\n strict: z.boolean().nullable().optional(),\n }).strict(),\n}).strict()\n\n/**\n * 非流式聊天补全入参;stream 等未声明字段明确拒绝。\n * @example\n * ```ts\n * import { AiChatCompletionInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionInputSchema.parse({\n * messages: [\n * {\n * role: 'user',\n * content: 'Say hello'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionInputSchema = z.object({\n /** 默认绑定认证用户;跨主体访问需服务端显式授权。 */\n objectId: z.string().min(1).optional(),\n /** 用户主体内的会话 ID,省略时为 default。 */\n sessionId: z.string().min(1).optional(),\n model: z.string().optional(),\n messages: z.array(AiChatMessageSchema).min(1),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n max_tokens: z.number().int().min(1).optional(),\n tools: z.array(AiToolDefinitionSchema).min(1).optional(),\n tool_choice: z.union([\n z.literal('auto'),\n z.literal('none'),\n z.literal('required'),\n z.object({ type: z.literal('function'), function: z.object({ name: z.string().min(1) }).strict() }).strict(),\n ]).optional(),\n}).strict().superRefine((input, context) => {\n const choice = input.tool_choice\n if (choice === 'required' && !input.tools?.length)\n context.addIssue({ code: 'custom', path: ['tool_choice'] })\n if (typeof choice === 'object' && !input.tools?.some(tool => tool.function.name === choice.function.name))\n context.addIssue({ code: 'custom', path: ['tool_choice'] })\n})\n\n/**\n * Token 使用统计 Schema。\n * @example\n * ```ts\n * import { AiTokenUsageSchema } from '@h-ai/api-contract'\n *\n * const value = AiTokenUsageSchema.parse({\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * })\n * void value\n * ```\n */\nexport const AiTokenUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n})\n\n/**\n * 助手消息 Schema。\n * @example\n * ```ts\n * import { AiAssistantMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AiAssistantMessageSchema.parse({\n * role: 'assistant',\n * content: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.string().nullable().optional(),\n tool_calls: z.array(AiToolCallSchema).optional(),\n})\n\n/**\n * 聊天完成选择 Schema。\n * @example\n * ```ts\n * import { AiChatCompletionChoiceSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionChoiceSchema.parse({\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: AiAssistantMessageSchema,\n finish_reason: z.enum(['stop', 'length', 'tool_calls', 'content_filter']),\n})\n\n/**\n * 聊天完成业务数据 Schema。\n * @example\n * ```ts\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionDataSchema = z.object({\n id: z.string(),\n object: z.literal('chat.completion'),\n created: z.number(),\n model: z.string(),\n choices: z.array(AiChatCompletionChoiceSchema),\n usage: AiTokenUsageSchema,\n})\n\n/**\n * 简单消息入参 Schema。\n * @example\n * ```ts\n * import { AiSendMessageInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiSendMessageInputSchema.parse({\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport const AiSendMessageInputSchema = z.object({\n /** 默认绑定认证用户;跨主体访问需服务端显式授权。 */\n objectId: z.string().min(1).optional(),\n /** 用户主体内的会话 ID,省略时为 default。 */\n sessionId: z.string().min(1).optional(),\n message: z.string().min(1),\n systemPrompt: z.string().optional(),\n model: z.string().optional(),\n temperature: z.number().min(0).max(2).optional(),\n})\n\n/**\n * 简单消息业务数据 Schema。\n * @example\n * ```ts\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * })\n * void value\n * ```\n */\nexport const AiSendMessageDataSchema = z.object({\n content: z.string(),\n model: z.string(),\n usage: AiTokenUsageSchema.optional(),\n})\n\n/**\n * 记忆类型 Schema。\n * @example\n * ```ts\n * import { AiMemoryTypeSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryTypeSchema.parse('fact')\n * void value\n * ```\n */\nexport const AiMemoryTypeSchema = z.enum(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/**\n * 记忆条目 Schema。\n * @example\n * ```ts\n * import { AiMemoryEntrySchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryEntrySchema.parse({\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * })\n * void value\n * ```\n */\nexport const AiMemoryEntrySchema = z.object({\n id: z.string(),\n content: z.string(),\n type: AiMemoryTypeSchema,\n importance: z.number(),\n objectId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.number(),\n lastAccessedAt: z.number(),\n accessCount: z.number(),\n})\n\n/**\n * 记忆检索入参 Schema。\n * @example\n * ```ts\n * import { AiMemoryRecallInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryRecallInputSchema.parse({\n * query: 'example'\n * })\n * void value\n * ```\n */\nexport const AiMemoryRecallInputSchema = z.object({\n query: z.string().min(1),\n topK: z.number().int().min(1).optional(),\n types: z.array(AiMemoryTypeSchema).optional(),\n minImportance: z.number().min(0).max(1).optional(),\n objectId: z.string().min(1).optional(),\n})\n\n/**\n * 记忆检索业务数据 Schema。\n * @example\n * ```ts\n * import { AiMemoryRecallDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryRecallDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiMemoryRecallDataSchema = z.object({\n items: z.array(AiMemoryEntrySchema),\n})\n\n/**\n * 记忆列表入参 Schema。\n * @example\n * ```ts\n * import { AiMemoryListInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryListInputSchema.parse({})\n * void value\n * ```\n */\nexport const AiMemoryListInputSchema = z.object({\n types: z.array(AiMemoryTypeSchema).optional(),\n objectId: z.string().min(1).optional(),\n offset: z.number().int().min(0).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n})\n\n/**\n * 记忆列表业务数据 Schema。\n * @example\n * ```ts\n * import { AiMemoryListDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryListDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * }\n * ],\n * total: 0\n * })\n * void value\n * ```\n */\nexport const AiMemoryListDataSchema = z.object({\n items: z.array(AiMemoryEntrySchema),\n total: z.number(),\n})\n\n/**\n * 会话信息 Schema。\n * @example\n * ```ts\n * import { AiSessionInfoSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionInfoSchema.parse({\n * objectId: 'example',\n * sessionId: 'example',\n * createdAt: 0,\n * updatedAt: 0\n * })\n * void value\n * ```\n */\nexport const AiSessionInfoSchema = z.object({\n objectId: z.string(),\n sessionId: z.string(),\n createdAt: z.number(),\n updatedAt: z.number(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * 会话列表入参 Schema。\n * @example\n * ```ts\n * import { AiSessionListInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionListInputSchema.parse({})\n * void value\n * ```\n */\nexport const AiSessionListInputSchema = z.object({\n /** 省略时由服务端绑定认证用户,不能据客户端参数推断身份。 */\n objectId: z.string().min(1).optional(),\n})\n\n/**\n * 会话列表业务数据 Schema。\n * @example\n * ```ts\n * import { AiSessionListDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionListDataSchema.parse({\n * items: [\n * {\n * objectId: 'example',\n * sessionId: 'example',\n * createdAt: 0,\n * updatedAt: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiSessionListDataSchema = z.object({\n items: z.array(AiSessionInfoSchema),\n})\n\n/**\n * 对话记录 Schema。\n * @example\n * ```ts\n * import { AiChatRecordSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatRecordSchema.parse({\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * })\n * void value\n * ```\n */\nexport const AiChatRecordSchema = z.object({\n id: z.string(),\n objectId: z.string(),\n sessionId: z.string(),\n request: z.object({\n model: z.string(),\n messages: z.array(AiChatMessageSchema),\n }),\n response: z.object({\n content: z.string(),\n toolCalls: z.array(AiToolCallSchema).optional(),\n finishReason: z.string(),\n usage: AiTokenUsageSchema,\n }),\n createdAt: z.number(),\n duration: z.number(),\n})\n\n/**\n * 对话历史入参 Schema。\n * @example\n * ```ts\n * import { AiChatHistoryInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatHistoryInputSchema.parse({\n * sessionId: 'example'\n * })\n * void value\n * ```\n */\nexport const AiChatHistoryInputSchema = z.object({\n /** 省略时由服务端绑定认证用户,跨主体访问需显式授权。 */\n objectId: z.string().min(1).optional(),\n sessionId: z.string().min(1),\n limit: z.number().int().min(1).max(200).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n})\n\n/**\n * 对话历史业务数据 Schema。\n * @example\n * ```ts\n * import { AiChatHistoryDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatHistoryDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiChatHistoryDataSchema = z.object({\n items: z.array(AiChatRecordSchema),\n})\n\n/**\n * 聊天补全请求,含消息、模型和生成参数。\n * @example\n * ```ts\n * import type { AiChatCompletionInput } from '@h-ai/api-contract'\n * import { AiChatCompletionInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatCompletionInput = AiChatCompletionInputSchema.parse({\n * messages: [\n * {\n * role: 'user',\n * content: 'Say hello'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport type AiChatCompletionInput = z.infer<typeof AiChatCompletionInputSchema>\n/**\n * 聊天补全业务数据,含候选消息与用量。\n * @example\n * ```ts\n * import type { AiChatCompletionData } from '@h-ai/api-contract'\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatCompletionData = AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * })\n * void value\n * ```\n */\nexport type AiChatCompletionData = z.infer<typeof AiChatCompletionDataSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 AiChatCompletionOutput 响应。\n * @example\n * ```ts\n * import type { AiChatCompletionOutput } from '@h-ai/api-contract'\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: AiChatCompletionOutput = ok(AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type AiChatCompletionOutput = HaiResult<AiChatCompletionData>\n/**\n * 会话消息发送请求。\n * @example\n * ```ts\n * import type { AiSendMessageInput } from '@h-ai/api-contract'\n * import { AiSendMessageInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiSendMessageInput = AiSendMessageInputSchema.parse({\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport type AiSendMessageInput = z.infer<typeof AiSendMessageInputSchema>\n/**\n * 会话消息写入后的业务数据。\n * @example\n * ```ts\n * import type { AiSendMessageData } from '@h-ai/api-contract'\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n *\n * const value: AiSendMessageData = AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * })\n * void value\n * ```\n */\nexport type AiSendMessageData = z.infer<typeof AiSendMessageDataSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 AiSendMessageOutput 响应。\n * @example\n * ```ts\n * import type { AiSendMessageOutput } from '@h-ai/api-contract'\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: AiSendMessageOutput = ok(AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type AiSendMessageOutput = HaiResult<AiSendMessageData>\n/**\n * 按主体和条件检索记忆的请求。\n * @example\n * ```ts\n * import type { AiMemoryRecallInput } from '@h-ai/api-contract'\n * import { AiMemoryRecallInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiMemoryRecallInput = AiMemoryRecallInputSchema.parse({\n * query: 'example'\n * })\n * void value\n * ```\n */\nexport type AiMemoryRecallInput = z.infer<typeof AiMemoryRecallInputSchema>\n/**\n * 按主体查询记忆列表的分页请求。\n * @example\n * ```ts\n * import type { AiMemoryListInput } from '@h-ai/api-contract'\n * import { AiMemoryListInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiMemoryListInput = AiMemoryListInputSchema.parse({})\n * void value\n * ```\n */\nexport type AiMemoryListInput = z.infer<typeof AiMemoryListInputSchema>\n/**\n * 按主体列出会话的分页请求。\n * @example\n * ```ts\n * import type { AiSessionListInput } from '@h-ai/api-contract'\n * import { AiSessionListInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiSessionListInput = AiSessionListInputSchema.parse({})\n * void value\n * ```\n */\nexport type AiSessionListInput = z.infer<typeof AiSessionListInputSchema>\n/**\n * 读取指定会话历史的请求。\n * @example\n * ```ts\n * import type { AiChatHistoryInput } from '@h-ai/api-contract'\n * import { AiChatHistoryInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatHistoryInput = AiChatHistoryInputSchema.parse({\n * sessionId: 'example'\n * })\n * void value\n * ```\n */\nexport type AiChatHistoryInput = z.infer<typeof AiChatHistoryInputSchema>\n/**\n * 会话持久化消息记录。\n * @example\n * ```ts\n * import type { AiChatRecord } from '@h-ai/api-contract'\n * import { AiChatRecordSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatRecord = AiChatRecordSchema.parse({\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * })\n * void value\n * ```\n */\nexport type AiChatRecord = z.infer<typeof AiChatRecordSchema>\n","/**\n * @h-ai/api-contract — AI 领域 contract\n *\n * 定义 AI 功能相关 API 的接口边界:聊天补全、记忆管理与会话管理。\n * 聊天补全使用 OpenAI 兼容结构(`messages` 数组 + `choices` 数组)。\n * 所有接口均需 Bearer Token 认证(由 `@h-ai/serv` 的 feature 层强制)。\n * 默认绑定认证用户的 objectId;其它主体和会话的访问须经过服务端资源授权。\n * @module ai-contract\n */\n\nimport { haiResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n AiChatCompletionDataSchema,\n AiChatCompletionInputSchema,\n AiChatHistoryDataSchema,\n AiChatHistoryInputSchema,\n AiMemoryListDataSchema,\n AiMemoryListInputSchema,\n AiMemoryRecallDataSchema,\n AiMemoryRecallInputSchema,\n AiSendMessageDataSchema,\n AiSendMessageInputSchema,\n AiSessionListDataSchema,\n AiSessionListInputSchema,\n} from './ai-schemas.js'\n\n/**\n * AI 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.ai\n * void contract\n * ```\n */\nexport const aiContract = {\n chats: {\n createCompletion: route({ method: 'POST', path: '/ai/chats/completions', operationId: 'ai.chats.createCompletion', summary: 'Create non-streaming chat completion with function tools', tags: ['ai', 'chats'] })\n .input(AiChatCompletionInputSchema)\n .output(haiResultSchema(AiChatCompletionDataSchema)),\n sendMessage: route({ method: 'POST', path: '/ai/chats/messages', operationId: 'ai.chats.sendMessage', summary: 'Send a single chat message', tags: ['ai', 'chats'] })\n .input(AiSendMessageInputSchema)\n .output(haiResultSchema(AiSendMessageDataSchema)),\n listHistory: route({ method: 'POST', path: '/ai/chats/history', operationId: 'ai.chats.listHistory', summary: 'List chat history', tags: ['ai', 'chats'] })\n .input(AiChatHistoryInputSchema)\n .output(haiResultSchema(AiChatHistoryDataSchema)),\n },\n memories: {\n recall: route({ method: 'POST', path: '/ai/memories/recall', operationId: 'ai.memories.recall', summary: 'Recall relevant memories', tags: ['ai', 'memories'] })\n .input(AiMemoryRecallInputSchema)\n .output(haiResultSchema(AiMemoryRecallDataSchema)),\n list: route({ method: 'POST', path: '/ai/memories/list', operationId: 'ai.memories.list', summary: 'List memories', tags: ['ai', 'memories'] })\n .input(AiMemoryListInputSchema)\n .output(haiResultSchema(AiMemoryListDataSchema)),\n },\n sessions: {\n list: route({ method: 'POST', path: '/ai/sessions/list', operationId: 'ai.sessions.list', summary: 'List sessions', tags: ['ai', 'sessions'] })\n .input(AiSessionListInputSchema)\n .output(haiResultSchema(AiSessionListDataSchema)),\n },\n}\n\n/**\n * ai 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { AiContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: AiContract = apiContract.ai\n * void contract\n * ```\n */\nexport type AiContract = typeof aiContract\n"]}
@@ -1,4 +1,4 @@
1
- import { haiResultSchema, route } from './chunk-JKPLID6E.js';
1
+ import { haiResultSchema, route } from './chunk-5UEDYQLG.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  var PaymentProviderSchema = z.enum(["wechat", "alipay", "stripe"]);
@@ -63,5 +63,5 @@ var paymentContract = {
63
63
  };
64
64
 
65
65
  export { PaymentCreateOrderDataSchema, PaymentCreateOrderInputSchema, PaymentNotifyMessageSchema, PaymentOrderSchema, PaymentProviderSchema, PaymentQueryOrderInputSchema, PaymentRefundDataSchema, PaymentRefundInputSchema, PaymentStripeNotifyDataSchema, PaymentTradeTypeSchema, paymentContract };
66
- //# sourceMappingURL=chunk-R5GDWFYC.js.map
67
- //# sourceMappingURL=chunk-R5GDWFYC.js.map
66
+ //# sourceMappingURL=chunk-M4DEKGOP.js.map
67
+ //# sourceMappingURL=chunk-M4DEKGOP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/payment/payment-schemas.ts","../src/payment/payment-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-R5GDWFYC.js","sourcesContent":["import type { HaiResult } from '@h-ai/core'\nimport { z } from 'zod'\n\n/**\n * 支付渠道 Schema。\n * @example\n * ```ts\n * import { PaymentProviderSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentProviderSchema.parse('wechat')\n * void value\n * ```\n */\nexport const PaymentProviderSchema = z.enum(['wechat', 'alipay', 'stripe'])\n\n/**\n * 完整实现的支付类型:微信 jsapi,支付宝/Stripe h5。\n * @example\n * ```ts\n * import { PaymentTradeTypeSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentTradeTypeSchema.parse('jsapi')\n * void value\n * ```\n */\nexport const PaymentTradeTypeSchema = z.enum(['jsapi', 'h5'])\n\n/**\n * 创建支付订单入参 Schema。\n * @example\n * ```ts\n * import { PaymentCreateOrderInputSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentCreateOrderInputSchema.parse({\n * provider: 'wechat',\n * amount: 100,\n * description: 'Example order',\n * tradeType: 'jsapi',\n * userId: 'example-openid'\n * })\n * void value\n * ```\n */\nexport const PaymentCreateOrderInputSchema = z.object({\n provider: PaymentProviderSchema,\n amount: z.number().int().min(1),\n description: z.string().min(1),\n tradeType: PaymentTradeTypeSchema,\n userId: z.string().trim().min(1).max(128).optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n}).strict().refine(input => input.tradeType === (input.provider === 'wechat' ? 'jsapi' : 'h5'), { path: ['tradeType'] }).refine(input => input.provider !== 'wechat' || input.userId !== undefined, { path: ['userId'] })\n\n/**\n * 创建支付订单业务数据 Schema。\n * @example\n * ```ts\n * import { PaymentCreateOrderDataSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentCreateOrderDataSchema.parse({\n * provider: 'wechat',\n * tradeType: 'jsapi',\n * prepayId: 'example-prepay',\n * clientParams: {\n * appId: 'wx-example',\n * timeStamp: '1767225600',\n * nonceStr: 'example-nonce',\n * package: 'prepay_id=example-prepay',\n * signType: 'RSA',\n * paySign: 'example-only-signature'\n * }\n * })\n * void value\n * ```\n */\nexport const PaymentCreateOrderDataSchema = z.object({\n provider: PaymentProviderSchema,\n tradeType: PaymentTradeTypeSchema,\n clientParams: z.record(z.string(), z.unknown()),\n prepayId: z.string().optional(),\n}).refine(order => order.tradeType === (order.provider === 'wechat' ? 'jsapi' : 'h5'), { path: ['tradeType'] })\n\n/**\n * 查询支付订单入参 Schema。\n * @example\n * ```ts\n * import { PaymentQueryOrderInputSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentQueryOrderInputSchema.parse({\n * orderNo: 'order_1'\n * })\n * void value\n * ```\n */\nexport const PaymentQueryOrderInputSchema = z.object({\n orderNo: z.string().min(1),\n})\n\n/**\n * 支付订单业务数据 Schema。\n * @example\n * ```ts\n * import { PaymentOrderSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentOrderSchema.parse({\n * orderNo: 'order_1',\n * status: 'pending',\n * amount: 0\n * })\n * void value\n * ```\n */\nexport const PaymentOrderSchema = z.object({\n orderNo: z.string(),\n transactionId: z.string().optional(),\n status: z.enum(['pending', 'paid', 'closed', 'refunded', 'failed']),\n amount: z.number(),\n // ISO 8601 时间戳(例如 `2024-01-02T03:04:05.000Z`),由服务端以 `Date#toISOString()` 序列化。\n paidAt: z.iso.datetime().optional(),\n})\n\n/**\n * 退款入参 Schema。\n * @example\n * ```ts\n * import { PaymentRefundInputSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentRefundInputSchema.parse({\n * provider: 'wechat',\n * orderNo: 'order_1',\n * refundNo: 'refund_1',\n * amount: 1\n * })\n * void value\n * ```\n */\nexport const PaymentRefundInputSchema = z.object({\n provider: PaymentProviderSchema,\n orderNo: z.string(),\n refundNo: z.string(),\n amount: z.number().int().min(1),\n reason: z.string().optional(),\n})\n\n/**\n * 退款业务数据 Schema。\n * @example\n * ```ts\n * import { PaymentRefundDataSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentRefundDataSchema.parse({\n * refundNo: 'refund_1',\n * refundId: 'example',\n * status: 'processing'\n * })\n * void value\n * ```\n */\nexport const PaymentRefundDataSchema = z.object({\n refundNo: z.string(),\n refundId: z.string(),\n status: z.enum(['processing', 'success', 'failed']),\n})\n\n/**\n * 微信/支付宝通知响应 Schema。\n * @example\n * ```ts\n * import { PaymentNotifyMessageSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentNotifyMessageSchema.parse({\n * code: 'example-1',\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport const PaymentNotifyMessageSchema = z.object({\n code: z.string(),\n message: z.string(),\n})\n\n/**\n * Stripe 通知响应 Schema。\n * @example\n * ```ts\n * import { PaymentStripeNotifyDataSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentStripeNotifyDataSchema.parse({\n * received: true\n * })\n * void value\n * ```\n */\nexport const PaymentStripeNotifyDataSchema = z.object({\n received: z.boolean(),\n})\n\n/**\n * 按渠道和已实现支付方式创建订单的请求。\n * @example\n * ```ts\n * import type { PaymentCreateOrderInput } from '@h-ai/api-contract'\n * import { PaymentCreateOrderInputSchema } from '@h-ai/api-contract'\n *\n * const value: PaymentCreateOrderInput = PaymentCreateOrderInputSchema.parse({\n * provider: 'wechat',\n * amount: 100,\n * description: 'Example order',\n * tradeType: 'jsapi',\n * userId: 'example-openid'\n * })\n * void value\n * ```\n */\nexport type PaymentCreateOrderInput = z.infer<typeof PaymentCreateOrderInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 PaymentCreateOrderOutput 响应。\n * @example\n * ```ts\n * import type { PaymentCreateOrderOutput } from '@h-ai/api-contract'\n * import { PaymentCreateOrderDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: PaymentCreateOrderOutput = ok(PaymentCreateOrderDataSchema.parse({\n * provider: 'wechat',\n * tradeType: 'jsapi',\n * prepayId: 'example-prepay',\n * clientParams: {\n * appId: 'wx-example',\n * timeStamp: '1767225600',\n * nonceStr: 'example-nonce',\n * package: 'prepay_id=example-prepay',\n * signType: 'RSA',\n * paySign: 'example-only-signature'\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type PaymentCreateOrderOutput = HaiResult<z.infer<typeof PaymentCreateOrderDataSchema>>\n/**\n * 退款请求,金额单位与支付契约一致。\n * @example\n * ```ts\n * import type { PaymentRefundInput } from '@h-ai/api-contract'\n * import { PaymentRefundInputSchema } from '@h-ai/api-contract'\n *\n * const value: PaymentRefundInput = PaymentRefundInputSchema.parse({\n * provider: 'wechat',\n * orderNo: 'order_1',\n * refundNo: 'refund_1',\n * amount: 1\n * })\n * void value\n * ```\n */\nexport type PaymentRefundInput = z.infer<typeof PaymentRefundInputSchema>\n","import { z } from 'zod'\nimport { haiResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n PaymentCreateOrderDataSchema,\n PaymentCreateOrderInputSchema,\n PaymentNotifyMessageSchema,\n PaymentOrderSchema,\n PaymentQueryOrderInputSchema,\n PaymentRefundDataSchema,\n PaymentRefundInputSchema,\n PaymentStripeNotifyDataSchema,\n} from './payment-schemas.js'\n\n// Webhook 通知体由各支付渠道决定(且通常需要原始 raw body 校验签名),\n// 因此 contract 层只声明为 unknown,由 procedure 实现负责按渠道解析。\nconst WebhookBodySchema = z.unknown()\n// 微信与支付宝通知共享同一响应结构,仅在本 contract 内复用。\nconst notifyMessageOutputSchema = haiResultSchema(PaymentNotifyMessageSchema)\n\n/**\n * Payment 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.payment\n * void contract\n * ```\n */\nexport const paymentContract = {\n orders: {\n create: route({ method: 'POST', path: '/payment/orders', operationId: 'payment.orders.create', summary: 'Create payment order', tags: ['payment', 'orders'] })\n .input(PaymentCreateOrderInputSchema)\n .output(haiResultSchema(PaymentCreateOrderDataSchema)),\n get: route({ method: 'GET', path: '/payment/orders/{orderNo}', operationId: 'payment.orders.get', summary: 'Get payment order', tags: ['payment', 'orders'] })\n .input(PaymentQueryOrderInputSchema)\n .output(haiResultSchema(PaymentOrderSchema)),\n refund: route({ method: 'POST', path: '/payment/orders/{orderNo}/refunds', operationId: 'payment.orders.refund', summary: 'Refund payment order', tags: ['payment', 'orders'] })\n .input(PaymentRefundInputSchema)\n .output(haiResultSchema(PaymentRefundDataSchema)),\n },\n notifications: {\n wechat: route({ method: 'POST', path: '/payment/notifications/wechat', operationId: 'payment.notifications.wechat', summary: 'Handle WeChat payment notification', tags: ['payment', 'notifications'] })\n .input(WebhookBodySchema)\n .output(notifyMessageOutputSchema),\n alipay: route({ method: 'POST', path: '/payment/notifications/alipay', operationId: 'payment.notifications.alipay', summary: 'Handle Alipay payment notification', tags: ['payment', 'notifications'] })\n .input(WebhookBodySchema)\n .output(notifyMessageOutputSchema),\n stripe: route({ method: 'POST', path: '/payment/notifications/stripe', operationId: 'payment.notifications.stripe', summary: 'Handle Stripe payment notification', tags: ['payment', 'notifications'] })\n .input(WebhookBodySchema)\n .output(haiResultSchema(PaymentStripeNotifyDataSchema)),\n },\n}\n\n/**\n * payment 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { PaymentContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: PaymentContract = apiContract.payment\n * void contract\n * ```\n */\nexport type PaymentContract = typeof paymentContract\n"]}
1
+ {"version":3,"sources":["../src/payment/payment-schemas.ts","../src/payment/payment-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-M4DEKGOP.js","sourcesContent":["import type { HaiResult } from '@h-ai/core'\nimport { z } from 'zod'\n\n/**\n * 支付渠道 Schema。\n * @example\n * ```ts\n * import { PaymentProviderSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentProviderSchema.parse('wechat')\n * void value\n * ```\n */\nexport const PaymentProviderSchema = z.enum(['wechat', 'alipay', 'stripe'])\n\n/**\n * 完整实现的支付类型:微信 jsapi,支付宝/Stripe h5。\n * @example\n * ```ts\n * import { PaymentTradeTypeSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentTradeTypeSchema.parse('jsapi')\n * void value\n * ```\n */\nexport const PaymentTradeTypeSchema = z.enum(['jsapi', 'h5'])\n\n/**\n * 创建支付订单入参 Schema。\n * @example\n * ```ts\n * import { PaymentCreateOrderInputSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentCreateOrderInputSchema.parse({\n * provider: 'wechat',\n * amount: 100,\n * description: 'Example order',\n * tradeType: 'jsapi',\n * userId: 'example-openid'\n * })\n * void value\n * ```\n */\nexport const PaymentCreateOrderInputSchema = z.object({\n provider: PaymentProviderSchema,\n amount: z.number().int().min(1),\n description: z.string().min(1),\n tradeType: PaymentTradeTypeSchema,\n userId: z.string().trim().min(1).max(128).optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n}).strict().refine(input => input.tradeType === (input.provider === 'wechat' ? 'jsapi' : 'h5'), { path: ['tradeType'] }).refine(input => input.provider !== 'wechat' || input.userId !== undefined, { path: ['userId'] })\n\n/**\n * 创建支付订单业务数据 Schema。\n * @example\n * ```ts\n * import { PaymentCreateOrderDataSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentCreateOrderDataSchema.parse({\n * provider: 'wechat',\n * tradeType: 'jsapi',\n * prepayId: 'example-prepay',\n * clientParams: {\n * appId: 'wx-example',\n * timeStamp: '1767225600',\n * nonceStr: 'example-nonce',\n * package: 'prepay_id=example-prepay',\n * signType: 'RSA',\n * paySign: 'example-only-signature'\n * }\n * })\n * void value\n * ```\n */\nexport const PaymentCreateOrderDataSchema = z.object({\n provider: PaymentProviderSchema,\n tradeType: PaymentTradeTypeSchema,\n clientParams: z.record(z.string(), z.unknown()),\n prepayId: z.string().optional(),\n}).refine(order => order.tradeType === (order.provider === 'wechat' ? 'jsapi' : 'h5'), { path: ['tradeType'] })\n\n/**\n * 查询支付订单入参 Schema。\n * @example\n * ```ts\n * import { PaymentQueryOrderInputSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentQueryOrderInputSchema.parse({\n * orderNo: 'order_1'\n * })\n * void value\n * ```\n */\nexport const PaymentQueryOrderInputSchema = z.object({\n orderNo: z.string().min(1),\n})\n\n/**\n * 支付订单业务数据 Schema。\n * @example\n * ```ts\n * import { PaymentOrderSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentOrderSchema.parse({\n * orderNo: 'order_1',\n * status: 'pending',\n * amount: 0\n * })\n * void value\n * ```\n */\nexport const PaymentOrderSchema = z.object({\n orderNo: z.string(),\n transactionId: z.string().optional(),\n status: z.enum(['pending', 'paid', 'closed', 'refunded', 'failed']),\n amount: z.number(),\n // ISO 8601 时间戳(例如 `2024-01-02T03:04:05.000Z`),由服务端以 `Date#toISOString()` 序列化。\n paidAt: z.iso.datetime().optional(),\n})\n\n/**\n * 退款入参 Schema。\n * @example\n * ```ts\n * import { PaymentRefundInputSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentRefundInputSchema.parse({\n * provider: 'wechat',\n * orderNo: 'order_1',\n * refundNo: 'refund_1',\n * amount: 1\n * })\n * void value\n * ```\n */\nexport const PaymentRefundInputSchema = z.object({\n provider: PaymentProviderSchema,\n orderNo: z.string(),\n refundNo: z.string(),\n amount: z.number().int().min(1),\n reason: z.string().optional(),\n})\n\n/**\n * 退款业务数据 Schema。\n * @example\n * ```ts\n * import { PaymentRefundDataSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentRefundDataSchema.parse({\n * refundNo: 'refund_1',\n * refundId: 'example',\n * status: 'processing'\n * })\n * void value\n * ```\n */\nexport const PaymentRefundDataSchema = z.object({\n refundNo: z.string(),\n refundId: z.string(),\n status: z.enum(['processing', 'success', 'failed']),\n})\n\n/**\n * 微信/支付宝通知响应 Schema。\n * @example\n * ```ts\n * import { PaymentNotifyMessageSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentNotifyMessageSchema.parse({\n * code: 'example-1',\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport const PaymentNotifyMessageSchema = z.object({\n code: z.string(),\n message: z.string(),\n})\n\n/**\n * Stripe 通知响应 Schema。\n * @example\n * ```ts\n * import { PaymentStripeNotifyDataSchema } from '@h-ai/api-contract'\n *\n * const value = PaymentStripeNotifyDataSchema.parse({\n * received: true\n * })\n * void value\n * ```\n */\nexport const PaymentStripeNotifyDataSchema = z.object({\n received: z.boolean(),\n})\n\n/**\n * 按渠道和已实现支付方式创建订单的请求。\n * @example\n * ```ts\n * import type { PaymentCreateOrderInput } from '@h-ai/api-contract'\n * import { PaymentCreateOrderInputSchema } from '@h-ai/api-contract'\n *\n * const value: PaymentCreateOrderInput = PaymentCreateOrderInputSchema.parse({\n * provider: 'wechat',\n * amount: 100,\n * description: 'Example order',\n * tradeType: 'jsapi',\n * userId: 'example-openid'\n * })\n * void value\n * ```\n */\nexport type PaymentCreateOrderInput = z.infer<typeof PaymentCreateOrderInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 PaymentCreateOrderOutput 响应。\n * @example\n * ```ts\n * import type { PaymentCreateOrderOutput } from '@h-ai/api-contract'\n * import { PaymentCreateOrderDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: PaymentCreateOrderOutput = ok(PaymentCreateOrderDataSchema.parse({\n * provider: 'wechat',\n * tradeType: 'jsapi',\n * prepayId: 'example-prepay',\n * clientParams: {\n * appId: 'wx-example',\n * timeStamp: '1767225600',\n * nonceStr: 'example-nonce',\n * package: 'prepay_id=example-prepay',\n * signType: 'RSA',\n * paySign: 'example-only-signature'\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type PaymentCreateOrderOutput = HaiResult<z.infer<typeof PaymentCreateOrderDataSchema>>\n/**\n * 退款请求,金额单位与支付契约一致。\n * @example\n * ```ts\n * import type { PaymentRefundInput } from '@h-ai/api-contract'\n * import { PaymentRefundInputSchema } from '@h-ai/api-contract'\n *\n * const value: PaymentRefundInput = PaymentRefundInputSchema.parse({\n * provider: 'wechat',\n * orderNo: 'order_1',\n * refundNo: 'refund_1',\n * amount: 1\n * })\n * void value\n * ```\n */\nexport type PaymentRefundInput = z.infer<typeof PaymentRefundInputSchema>\n","import { z } from 'zod'\nimport { haiResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n PaymentCreateOrderDataSchema,\n PaymentCreateOrderInputSchema,\n PaymentNotifyMessageSchema,\n PaymentOrderSchema,\n PaymentQueryOrderInputSchema,\n PaymentRefundDataSchema,\n PaymentRefundInputSchema,\n PaymentStripeNotifyDataSchema,\n} from './payment-schemas.js'\n\n// Webhook 通知体由各支付渠道决定(且通常需要原始 raw body 校验签名),\n// 因此 contract 层只声明为 unknown,由 procedure 实现负责按渠道解析。\nconst WebhookBodySchema = z.unknown()\n// 微信与支付宝通知共享同一响应结构,仅在本 contract 内复用。\nconst notifyMessageOutputSchema = haiResultSchema(PaymentNotifyMessageSchema)\n\n/**\n * Payment 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.payment\n * void contract\n * ```\n */\nexport const paymentContract = {\n orders: {\n create: route({ method: 'POST', path: '/payment/orders', operationId: 'payment.orders.create', summary: 'Create payment order', tags: ['payment', 'orders'] })\n .input(PaymentCreateOrderInputSchema)\n .output(haiResultSchema(PaymentCreateOrderDataSchema)),\n get: route({ method: 'GET', path: '/payment/orders/{orderNo}', operationId: 'payment.orders.get', summary: 'Get payment order', tags: ['payment', 'orders'] })\n .input(PaymentQueryOrderInputSchema)\n .output(haiResultSchema(PaymentOrderSchema)),\n refund: route({ method: 'POST', path: '/payment/orders/{orderNo}/refunds', operationId: 'payment.orders.refund', summary: 'Refund payment order', tags: ['payment', 'orders'] })\n .input(PaymentRefundInputSchema)\n .output(haiResultSchema(PaymentRefundDataSchema)),\n },\n notifications: {\n wechat: route({ method: 'POST', path: '/payment/notifications/wechat', operationId: 'payment.notifications.wechat', summary: 'Handle WeChat payment notification', tags: ['payment', 'notifications'] })\n .input(WebhookBodySchema)\n .output(notifyMessageOutputSchema),\n alipay: route({ method: 'POST', path: '/payment/notifications/alipay', operationId: 'payment.notifications.alipay', summary: 'Handle Alipay payment notification', tags: ['payment', 'notifications'] })\n .input(WebhookBodySchema)\n .output(notifyMessageOutputSchema),\n stripe: route({ method: 'POST', path: '/payment/notifications/stripe', operationId: 'payment.notifications.stripe', summary: 'Handle Stripe payment notification', tags: ['payment', 'notifications'] })\n .input(WebhookBodySchema)\n .output(haiResultSchema(PaymentStripeNotifyDataSchema)),\n },\n}\n\n/**\n * payment 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { PaymentContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: PaymentContract = apiContract.payment\n * void contract\n * ```\n */\nexport type PaymentContract = typeof paymentContract\n"]}
@@ -1,4 +1,4 @@
1
- import { haiResultSchema, route, HaiErrorSchema, HaiVoidResultSchema } from './chunk-JKPLID6E.js';
1
+ import { haiResultSchema, route, HaiErrorSchema, HaiVoidResultSchema } from './chunk-5UEDYQLG.js';
2
2
  import { StorageKeySchema, StoragePresignExpiresInSchema, StoragePrefixSchema, StorageDeleteKeysSchema } from '@h-ai/storage/schemas';
3
3
  import { z } from 'zod';
4
4
 
@@ -72,5 +72,5 @@ var storageContract = {
72
72
  };
73
73
 
74
74
  export { StorageDeleteFilesInputSchema, StorageDeleteSummarySchema, StorageFileKeyInputSchema, StorageFileMetadataSchema, StorageListFilesDataSchema, StorageListFilesInputSchema, StoragePresignDownloadInputSchema, StoragePresignUploadInputSchema, StoragePresignedUrlSchema, storageContract };
75
- //# sourceMappingURL=chunk-IVZVAWEF.js.map
76
- //# sourceMappingURL=chunk-IVZVAWEF.js.map
75
+ //# sourceMappingURL=chunk-ZM7KM6V3.js.map
76
+ //# sourceMappingURL=chunk-ZM7KM6V3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/storage-schemas.ts","../src/storage/storage-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-IVZVAWEF.js","sourcesContent":["/**\n * @h-ai/api-contract — Storage 领域 Schema\n *\n * 包含文件元数据、预签名 URL、文件列表与删除相关的 input/output Zod Schema。\n * 仅保留跨接口、跨层复用的数据结构;一次性输出包装在 contract 中内联。\n * @module storage-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { StorageDeleteKeysSchema, StorageKeySchema, StoragePrefixSchema, StoragePresignExpiresInSchema } from '@h-ai/storage/schemas'\nimport { z } from 'zod'\n\n/**\n * 文件元数据 Schema。\n * @example\n * ```ts\n * import { StorageFileMetadataSchema } from '@h-ai/api-contract'\n *\n * const value = StorageFileMetadataSchema.parse({\n * key: 'examples/readme.txt',\n * size: 0,\n * contentType: 'example',\n * lastModified: null\n * })\n * void value\n * ```\n */\nexport const StorageFileMetadataSchema = z.object({\n key: z.string(),\n size: z.number(),\n contentType: z.string(),\n lastModified: z.coerce.date(),\n etag: z.string().optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n})\n\n/**\n * 获取下载签名 URL 入参 Schema。\n * @example\n * ```ts\n * import { StoragePresignDownloadInputSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignDownloadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignDownloadInputSchema = z.strictObject({\n key: StorageKeySchema,\n expiresIn: StoragePresignExpiresInSchema.optional(),\n})\n\n/**\n * 获取上传签名 URL 入参 Schema。\n * @example\n * ```ts\n * import { StoragePresignUploadInputSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignUploadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignUploadInputSchema = z.strictObject({\n key: StorageKeySchema,\n contentType: z.string().optional(),\n expiresIn: StoragePresignExpiresInSchema.optional(),\n})\n\n/**\n * 签名 URL 业务数据 Schema。\n * @example\n * ```ts\n * import { StoragePresignedUrlSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignedUrlSchema.parse({\n * url: 'https://example.com/resource',\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignedUrlSchema = z.object({\n url: z.string(),\n key: z.string(),\n expiresAt: z.coerce.date().optional(),\n})\n\n/**\n * 文件列表查询入参 Schema。\n * @example\n * ```ts\n * import { StorageListFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageListFilesInputSchema.parse({})\n * void value\n * ```\n */\nexport const StorageListFilesInputSchema = z.object({\n prefix: StoragePrefixSchema.optional(),\n maxKeys: z.coerce.number().int().min(1).max(1000).optional(),\n continuationToken: z.string().optional(),\n delimiter: z.string().optional(),\n})\n\n/**\n * 文件列表业务数据 Schema。\n * @example\n * ```ts\n * import { StorageListFilesDataSchema } from '@h-ai/api-contract'\n *\n * const value = StorageListFilesDataSchema.parse({\n * files: [\n * {\n * key: 'examples/readme.txt',\n * size: 0,\n * contentType: 'example',\n * lastModified: null\n * }\n * ],\n * commonPrefixes: [\n * 'example'\n * ],\n * isTruncated: true\n * })\n * void value\n * ```\n */\nexport const StorageListFilesDataSchema = z.object({\n files: z.array(StorageFileMetadataSchema),\n commonPrefixes: z.array(z.string()),\n nextContinuationToken: z.string().optional(),\n isTruncated: z.boolean(),\n})\n\n/**\n * 单文件操作入参 Schema。\n * @example\n * ```ts\n * import { StorageFileKeyInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageFileKeyInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StorageFileKeyInputSchema = z.object({\n key: StorageKeySchema,\n})\n\n/**\n * 批量删除文件入参 Schema。\n * @example\n * ```ts\n * import { StorageDeleteFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageDeleteFilesInputSchema.parse({\n * keys: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport const StorageDeleteFilesInputSchema = z.object({\n keys: StorageDeleteKeysSchema,\n})\n\n/**\n * 批量删除的安全进度;响应失败时通过 error.ext.deleteMany 返回同一结构。\n * @example\n * ```ts\n * import { StorageDeleteSummarySchema } from '@h-ai/api-contract'\n *\n * const value = StorageDeleteSummarySchema.parse({\n * deletedKeys: [\n * 'example'\n * ],\n * failures: [\n * {\n * key: 'examples/readme.txt',\n * code: 'example-1',\n * retryable: true,\n * outcome: 'failed'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const StorageDeleteSummarySchema = z.object({\n deletedKeys: z.array(z.string()),\n failures: z.array(z.object({\n key: z.string(),\n code: z.string(),\n retryable: z.boolean(),\n outcome: z.enum(['failed', 'unknown', 'notAttempted']),\n })),\n})\n\n/**\n * 为对象生成下载地址的请求。\n * @example\n * ```ts\n * import type { StoragePresignDownloadInput } from '@h-ai/api-contract'\n * import { StoragePresignDownloadInputSchema } from '@h-ai/api-contract'\n *\n * const value: StoragePresignDownloadInput = StoragePresignDownloadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StoragePresignDownloadInput = z.infer<typeof StoragePresignDownloadInputSchema>\n/**\n * 为对象生成上传地址的请求。\n * @example\n * ```ts\n * import type { StoragePresignUploadInput } from '@h-ai/api-contract'\n * import { StoragePresignUploadInputSchema } from '@h-ai/api-contract'\n *\n * const value: StoragePresignUploadInput = StoragePresignUploadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StoragePresignUploadInput = z.infer<typeof StoragePresignUploadInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 StoragePresignedUrlOutput 响应。\n * @example\n * ```ts\n * import type { StoragePresignedUrlOutput } from '@h-ai/api-contract'\n * import { StoragePresignedUrlSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: StoragePresignedUrlOutput = ok(StoragePresignedUrlSchema.parse({\n * url: 'https://example.com/resource',\n * key: 'examples/readme.txt'\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type StoragePresignedUrlOutput = HaiResult<z.infer<typeof StoragePresignedUrlSchema>>\n/**\n * 按前缀和游标列出对象的请求。\n * @example\n * ```ts\n * import type { StorageListFilesInput } from '@h-ai/api-contract'\n * import { StorageListFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageListFilesInput = StorageListFilesInputSchema.parse({})\n * void value\n * ```\n */\nexport type StorageListFilesInput = z.infer<typeof StorageListFilesInputSchema>\n/**\n * 以对象 key 定位文件的请求。\n * @example\n * ```ts\n * import type { StorageFileKeyInput } from '@h-ai/api-contract'\n * import { StorageFileKeyInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageFileKeyInput = StorageFileKeyInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StorageFileKeyInput = z.infer<typeof StorageFileKeyInputSchema>\n/**\n * 批量删除指定对象 key 的请求。\n * @example\n * ```ts\n * import type { StorageDeleteFilesInput } from '@h-ai/api-contract'\n * import { StorageDeleteFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageDeleteFilesInput = StorageDeleteFilesInputSchema.parse({\n * keys: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport type StorageDeleteFilesInput = z.infer<typeof StorageDeleteFilesInputSchema>\n","/**\n * @h-ai/api-contract — Storage 领域 contract\n *\n * 定义文件存储相关 API 的接口边界:预签名 URL 生成与文件管理。\n * 所有接口均需 Bearer Token 认证(由 `@h-ai/serv` 的 feature 层强制)。\n * 资源访问还须通过应用注入的 authorize 策略;认证不等同于拥有任意 key 的访问权。\n * @module storage-contract\n */\n\nimport { z } from 'zod'\nimport { HaiErrorSchema, haiResultSchema, HaiVoidResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n StorageDeleteFilesInputSchema,\n StorageDeleteSummarySchema,\n StorageFileKeyInputSchema,\n StorageFileMetadataSchema,\n StorageListFilesDataSchema,\n StorageListFilesInputSchema,\n StoragePresignDownloadInputSchema,\n StoragePresignedUrlSchema,\n StoragePresignUploadInputSchema,\n} from './storage-schemas.js'\n\n// 下载与上传接口共享同一响应结构,仅在本 contract 内复用。\nconst presignedUrlOutputSchema = haiResultSchema(StoragePresignedUrlSchema)\n\n/**\n * Storage 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.storage\n * void contract\n * ```\n */\nexport const storageContract = {\n presignedUrls: {\n createDownload: route({ method: 'POST', path: '/storage/presigned-urls/download', operationId: 'storage.presignedUrls.createDownload', summary: 'Create presigned download URL', tags: ['storage'] })\n .input(StoragePresignDownloadInputSchema)\n .output(presignedUrlOutputSchema),\n createUpload: route({ method: 'POST', path: '/storage/presigned-urls/upload', operationId: 'storage.presignedUrls.createUpload', summary: 'Create presigned upload URL', tags: ['storage'] })\n .input(StoragePresignUploadInputSchema)\n .output(presignedUrlOutputSchema),\n },\n files: {\n list: route({ method: 'GET', path: '/storage/files', operationId: 'storage.files.list', summary: 'List files', tags: ['storage'] })\n .input(StorageListFilesInputSchema)\n .output(haiResultSchema(StorageListFilesDataSchema)),\n getMetadata: route({ method: 'POST', path: '/storage/files/metadata', operationId: 'storage.files.getMetadata', summary: 'Get file metadata', tags: ['storage'] })\n .input(StorageFileKeyInputSchema)\n .output(haiResultSchema(StorageFileMetadataSchema)),\n delete: route({ method: 'DELETE', path: '/storage/files', operationId: 'storage.files.delete', summary: 'Delete file', tags: ['storage'] })\n .input(StorageFileKeyInputSchema)\n .output(HaiVoidResultSchema),\n deleteMany: route({ method: 'POST', path: '/storage/files/delete-many', operationId: 'storage.files.deleteMany', summary: 'Delete files', tags: ['storage'] })\n .input(StorageDeleteFilesInputSchema)\n .output(z.discriminatedUnion('success', [\n z.object({ success: z.literal(true), data: StorageDeleteSummarySchema }),\n z.object({\n success: z.literal(false),\n error: HaiErrorSchema.extend({ ext: z.object({ deleteMany: StorageDeleteSummarySchema.optional() }).catchall(z.unknown()).optional() }),\n }),\n ])),\n },\n}\n\n/**\n * storage 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { StorageContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: StorageContract = apiContract.storage\n * void contract\n * ```\n */\nexport type StorageContract = typeof storageContract\n"]}
1
+ {"version":3,"sources":["../src/storage/storage-schemas.ts","../src/storage/storage-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-ZM7KM6V3.js","sourcesContent":["/**\n * @h-ai/api-contract — Storage 领域 Schema\n *\n * 包含文件元数据、预签名 URL、文件列表与删除相关的 input/output Zod Schema。\n * 仅保留跨接口、跨层复用的数据结构;一次性输出包装在 contract 中内联。\n * @module storage-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { StorageDeleteKeysSchema, StorageKeySchema, StoragePrefixSchema, StoragePresignExpiresInSchema } from '@h-ai/storage/schemas'\nimport { z } from 'zod'\n\n/**\n * 文件元数据 Schema。\n * @example\n * ```ts\n * import { StorageFileMetadataSchema } from '@h-ai/api-contract'\n *\n * const value = StorageFileMetadataSchema.parse({\n * key: 'examples/readme.txt',\n * size: 0,\n * contentType: 'example',\n * lastModified: null\n * })\n * void value\n * ```\n */\nexport const StorageFileMetadataSchema = z.object({\n key: z.string(),\n size: z.number(),\n contentType: z.string(),\n lastModified: z.coerce.date(),\n etag: z.string().optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n})\n\n/**\n * 获取下载签名 URL 入参 Schema。\n * @example\n * ```ts\n * import { StoragePresignDownloadInputSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignDownloadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignDownloadInputSchema = z.strictObject({\n key: StorageKeySchema,\n expiresIn: StoragePresignExpiresInSchema.optional(),\n})\n\n/**\n * 获取上传签名 URL 入参 Schema。\n * @example\n * ```ts\n * import { StoragePresignUploadInputSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignUploadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignUploadInputSchema = z.strictObject({\n key: StorageKeySchema,\n contentType: z.string().optional(),\n expiresIn: StoragePresignExpiresInSchema.optional(),\n})\n\n/**\n * 签名 URL 业务数据 Schema。\n * @example\n * ```ts\n * import { StoragePresignedUrlSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignedUrlSchema.parse({\n * url: 'https://example.com/resource',\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignedUrlSchema = z.object({\n url: z.string(),\n key: z.string(),\n expiresAt: z.coerce.date().optional(),\n})\n\n/**\n * 文件列表查询入参 Schema。\n * @example\n * ```ts\n * import { StorageListFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageListFilesInputSchema.parse({})\n * void value\n * ```\n */\nexport const StorageListFilesInputSchema = z.object({\n prefix: StoragePrefixSchema.optional(),\n maxKeys: z.coerce.number().int().min(1).max(1000).optional(),\n continuationToken: z.string().optional(),\n delimiter: z.string().optional(),\n})\n\n/**\n * 文件列表业务数据 Schema。\n * @example\n * ```ts\n * import { StorageListFilesDataSchema } from '@h-ai/api-contract'\n *\n * const value = StorageListFilesDataSchema.parse({\n * files: [\n * {\n * key: 'examples/readme.txt',\n * size: 0,\n * contentType: 'example',\n * lastModified: null\n * }\n * ],\n * commonPrefixes: [\n * 'example'\n * ],\n * isTruncated: true\n * })\n * void value\n * ```\n */\nexport const StorageListFilesDataSchema = z.object({\n files: z.array(StorageFileMetadataSchema),\n commonPrefixes: z.array(z.string()),\n nextContinuationToken: z.string().optional(),\n isTruncated: z.boolean(),\n})\n\n/**\n * 单文件操作入参 Schema。\n * @example\n * ```ts\n * import { StorageFileKeyInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageFileKeyInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StorageFileKeyInputSchema = z.object({\n key: StorageKeySchema,\n})\n\n/**\n * 批量删除文件入参 Schema。\n * @example\n * ```ts\n * import { StorageDeleteFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageDeleteFilesInputSchema.parse({\n * keys: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport const StorageDeleteFilesInputSchema = z.object({\n keys: StorageDeleteKeysSchema,\n})\n\n/**\n * 批量删除的安全进度;响应失败时通过 error.ext.deleteMany 返回同一结构。\n * @example\n * ```ts\n * import { StorageDeleteSummarySchema } from '@h-ai/api-contract'\n *\n * const value = StorageDeleteSummarySchema.parse({\n * deletedKeys: [\n * 'example'\n * ],\n * failures: [\n * {\n * key: 'examples/readme.txt',\n * code: 'example-1',\n * retryable: true,\n * outcome: 'failed'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const StorageDeleteSummarySchema = z.object({\n deletedKeys: z.array(z.string()),\n failures: z.array(z.object({\n key: z.string(),\n code: z.string(),\n retryable: z.boolean(),\n outcome: z.enum(['failed', 'unknown', 'notAttempted']),\n })),\n})\n\n/**\n * 为对象生成下载地址的请求。\n * @example\n * ```ts\n * import type { StoragePresignDownloadInput } from '@h-ai/api-contract'\n * import { StoragePresignDownloadInputSchema } from '@h-ai/api-contract'\n *\n * const value: StoragePresignDownloadInput = StoragePresignDownloadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StoragePresignDownloadInput = z.infer<typeof StoragePresignDownloadInputSchema>\n/**\n * 为对象生成上传地址的请求。\n * @example\n * ```ts\n * import type { StoragePresignUploadInput } from '@h-ai/api-contract'\n * import { StoragePresignUploadInputSchema } from '@h-ai/api-contract'\n *\n * const value: StoragePresignUploadInput = StoragePresignUploadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StoragePresignUploadInput = z.infer<typeof StoragePresignUploadInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 StoragePresignedUrlOutput 响应。\n * @example\n * ```ts\n * import type { StoragePresignedUrlOutput } from '@h-ai/api-contract'\n * import { StoragePresignedUrlSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: StoragePresignedUrlOutput = ok(StoragePresignedUrlSchema.parse({\n * url: 'https://example.com/resource',\n * key: 'examples/readme.txt'\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type StoragePresignedUrlOutput = HaiResult<z.infer<typeof StoragePresignedUrlSchema>>\n/**\n * 按前缀和游标列出对象的请求。\n * @example\n * ```ts\n * import type { StorageListFilesInput } from '@h-ai/api-contract'\n * import { StorageListFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageListFilesInput = StorageListFilesInputSchema.parse({})\n * void value\n * ```\n */\nexport type StorageListFilesInput = z.infer<typeof StorageListFilesInputSchema>\n/**\n * 以对象 key 定位文件的请求。\n * @example\n * ```ts\n * import type { StorageFileKeyInput } from '@h-ai/api-contract'\n * import { StorageFileKeyInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageFileKeyInput = StorageFileKeyInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StorageFileKeyInput = z.infer<typeof StorageFileKeyInputSchema>\n/**\n * 批量删除指定对象 key 的请求。\n * @example\n * ```ts\n * import type { StorageDeleteFilesInput } from '@h-ai/api-contract'\n * import { StorageDeleteFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageDeleteFilesInput = StorageDeleteFilesInputSchema.parse({\n * keys: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport type StorageDeleteFilesInput = z.infer<typeof StorageDeleteFilesInputSchema>\n","/**\n * @h-ai/api-contract — Storage 领域 contract\n *\n * 定义文件存储相关 API 的接口边界:预签名 URL 生成与文件管理。\n * 所有接口均需 Bearer Token 认证(由 `@h-ai/serv` 的 feature 层强制)。\n * 资源访问还须通过应用注入的 authorize 策略;认证不等同于拥有任意 key 的访问权。\n * @module storage-contract\n */\n\nimport { z } from 'zod'\nimport { HaiErrorSchema, haiResultSchema, HaiVoidResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n StorageDeleteFilesInputSchema,\n StorageDeleteSummarySchema,\n StorageFileKeyInputSchema,\n StorageFileMetadataSchema,\n StorageListFilesDataSchema,\n StorageListFilesInputSchema,\n StoragePresignDownloadInputSchema,\n StoragePresignedUrlSchema,\n StoragePresignUploadInputSchema,\n} from './storage-schemas.js'\n\n// 下载与上传接口共享同一响应结构,仅在本 contract 内复用。\nconst presignedUrlOutputSchema = haiResultSchema(StoragePresignedUrlSchema)\n\n/**\n * Storage 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.storage\n * void contract\n * ```\n */\nexport const storageContract = {\n presignedUrls: {\n createDownload: route({ method: 'POST', path: '/storage/presigned-urls/download', operationId: 'storage.presignedUrls.createDownload', summary: 'Create presigned download URL', tags: ['storage'] })\n .input(StoragePresignDownloadInputSchema)\n .output(presignedUrlOutputSchema),\n createUpload: route({ method: 'POST', path: '/storage/presigned-urls/upload', operationId: 'storage.presignedUrls.createUpload', summary: 'Create presigned upload URL', tags: ['storage'] })\n .input(StoragePresignUploadInputSchema)\n .output(presignedUrlOutputSchema),\n },\n files: {\n list: route({ method: 'GET', path: '/storage/files', operationId: 'storage.files.list', summary: 'List files', tags: ['storage'] })\n .input(StorageListFilesInputSchema)\n .output(haiResultSchema(StorageListFilesDataSchema)),\n getMetadata: route({ method: 'POST', path: '/storage/files/metadata', operationId: 'storage.files.getMetadata', summary: 'Get file metadata', tags: ['storage'] })\n .input(StorageFileKeyInputSchema)\n .output(haiResultSchema(StorageFileMetadataSchema)),\n delete: route({ method: 'DELETE', path: '/storage/files', operationId: 'storage.files.delete', summary: 'Delete file', tags: ['storage'] })\n .input(StorageFileKeyInputSchema)\n .output(HaiVoidResultSchema),\n deleteMany: route({ method: 'POST', path: '/storage/files/delete-many', operationId: 'storage.files.deleteMany', summary: 'Delete files', tags: ['storage'] })\n .input(StorageDeleteFilesInputSchema)\n .output(z.discriminatedUnion('success', [\n z.object({ success: z.literal(true), data: StorageDeleteSummarySchema }),\n z.object({\n success: z.literal(false),\n error: HaiErrorSchema.extend({ ext: z.object({ deleteMany: StorageDeleteSummarySchema.optional() }).catchall(z.unknown()).optional() }),\n }),\n ])),\n },\n}\n\n/**\n * storage 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { StorageContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: StorageContract = apiContract.storage\n * void contract\n * ```\n */\nexport type StorageContract = typeof storageContract\n"]}