@h-ai/feedback 0.1.0-alpha.74 → 0.1.0-alpha.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +14 -4
- package/README.ja.md +14 -4
- package/README.md +14 -4
- package/dist/bundle/index.d.ts +2 -0
- package/dist/bundle/index.js +1 -1
- package/dist/{chunk-UIVT267C.js → chunk-7W47WZXY.js} +10 -6
- package/dist/chunk-7W47WZXY.js.map +1 -0
- package/dist/{chunk-5QWKURWU.js → chunk-KGMLTOMM.js} +5 -3
- package/dist/chunk-KGMLTOMM.js.map +1 -0
- package/dist/client/index.d.ts +12 -2
- package/dist/client/index.js +110 -17
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +276 -57
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/dist/chunk-5QWKURWU.js.map +0 -1
- package/dist/chunk-UIVT267C.js.map +0 -1
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/feedback-client-files.ts","../../src/client/feedback-client-image.ts","../../src/client/feedback-client-sanitize.ts","../../src/client/feedback-client-store.ts","../../src/client/feedback-client-main.ts","../../src/client/feedback-client-review.ts"],"names":["core","err","window","entry","ok","job"],"mappings":"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","file":"index.js","sourcesContent":["/** Web 下载、Tauri 保存对话框、Capacitor 原生分享的统一入口。原生插件按平台懒加载。 */\nimport type { FeedbackAttachmentData } from '@h-ai/api-contract/feedback'\nimport type { HaiResult } from '@h-ai/core'\nimport { core, err, ok } from '@h-ai/core'\nimport { feedbackM } from '../feedback-i18n.js'\nimport { HaiFeedbackError } from '../feedback-types.js'\n\n/**\n * 保存取消是正常用户操作,不应提示成功或失败。\n * @example\n * ```ts\n * import type { FeedbackSaveResult } from '@h-ai/feedback/client'\n * const cancelled: FeedbackSaveResult = { status: 'cancelled' }\n * ```\n */\nexport interface FeedbackSaveResult { status: 'saved' | 'shared' | 'cancelled' }\n\n/**\n * 由平台入口提供的保存器;Web 不导入原生插件。\n * @example\n * ```ts\n * import type { FeedbackFileSaver } from '@h-ai/feedback/client'\n * const save: FeedbackFileSaver = async () => ({ status: 'cancelled' })\n * ```\n */\nexport type FeedbackFileSaver = (bytes: Uint8Array, filename: string, contentType: string, signal?: AbortSignal) => Promise<FeedbackSaveResult>\n\nlet nativeSaver: FeedbackFileSaver | undefined\n\n/**\n * 原生入口一次性配置;生成工程自动调用。传 undefined 可解除自定义平台适配。\n * @example\n * ```ts\n * import { configureFeedbackSaving } from '@h-ai/feedback/client'\n * configureFeedbackSaving(undefined)\n * ```\n */\nexport function configureFeedbackSaving(saver: FeedbackFileSaver | undefined): void {\n nativeSaver = saver\n}\n\n/**\n * 解码受权附件或导出结果,网络与权限仍由 typed API 负责。\n * @example\n * ```ts\n * import { feedbackDataBytes } from '@h-ai/feedback/client'\n * const bytes = feedbackDataBytes({ name: 'data.txt', contentType: 'text/plain', dataBase64: 'YQ==' })\n * ```\n */\nexport function feedbackDataBytes(data: FeedbackAttachmentData): Uint8Array {\n return Uint8Array.from(atob(data.dataBase64), value => value.charCodeAt(0))\n}\n\n/**\n * 保存反馈文件。Tauri 只写用户选择的路径;Capacitor 只写临时缓存,分享结束后删除。\n * @example\n * ```ts\n * import { saveFeedbackFile } from '@h-ai/feedback/client'\n * const result = await saveFeedbackFile(new Uint8Array([1]), 'feedback.zip')\n * ```\n */\nexport async function saveFeedbackFile(bytes: Uint8Array, filename: string, contentType = 'application/zip', signal?: AbortSignal): Promise<HaiResult<FeedbackSaveResult>> {\n const name = [...filename].map(character => character.charCodeAt(0) < 32 || /[\\\\/:*?\"<>|]/.test(character) ? '_' : character).join('').slice(0, 200) || 'feedback.zip'\n try {\n if (signal?.aborted)\n return ok({ status: 'cancelled' })\n if (typeof window === 'undefined')\n throw new Error('Browser required')\n const capacitor: unknown = Reflect.get(window, 'Capacitor')\n const isNative = Reflect.get(window, '__TAURI_INTERNALS__') || (capacitor && typeof capacitor === 'object' && 'isNativePlatform' in capacitor && typeof capacitor.isNativePlatform === 'function' && capacitor.isNativePlatform())\n if (isNative) {\n if (!nativeSaver)\n throw new Error('Feedback platform saving adapter is not configured')\n return ok(await nativeSaver(bytes, name, contentType, signal))\n }\n const url = URL.createObjectURL(new Blob([new Uint8Array(bytes).buffer], { type: contentType }))\n const link = document.createElement('a')\n try {\n link.href = url\n link.download = name\n document.body.append(link)\n link.click()\n }\n finally {\n link.remove()\n setTimeout(() => URL.revokeObjectURL(url), 60000)\n }\n return ok({ status: 'saved' })\n }\n catch (cause) {\n const error = core.error.toPublic({ ...HaiFeedbackError.OPERATION_FAILED, message: feedbackM('feedback_operationFailed') })\n core.logger.error('Feedback file save failed', { traceId: error.traceId, error: cause })\n return err(error)\n }\n}\n","/**\n * 截图与标注都在浏览器侧执行,不把原始 DOM 上传到受理服务。\n * 标注默认使用原图像素;UI 可直接传 coordinateSpace: 'ratio',由 SDK 换算实际图片尺寸。\n * @example\n * ```ts\n * import type { FeedbackImageAnnotation } from '@h-ai/feedback/client'\n * const mask: FeedbackImageAnnotation = { x: 0, y: 0, width: 100, height: 40, mode: 'mask' }\n * ```\n */\nexport interface FeedbackImageAnnotation {\n /** ratio 由 SDK 按解码后的原图换算,宿主无需处理缩放或 JPEG 方向。 */\n coordinateSpace?: 'pixel' | 'ratio'\n x: number\n y: number\n width: number\n height: number\n mode: 'mask' | 'outline'\n}\n\nconst PRIVATE_SELECTOR = 'input[type=\"password\"],[data-feedback-private],.rr-block,.rr-mask'\nconst CONTROL_SELECTOR = 'input,textarea,select,[contenteditable]:not([contenteditable=\"false\"])'\n\n/**\n * 捕获当前可见页面;反馈 UI 必须由调用方在本操作完成之后打开。\n * @example 模块内部上下文\n * ```ts\n * const bytes = await captureFeedbackScreenshot()\n * const length = bytes.byteLength\n * ```\n */\nexport async function captureFeedbackScreenshot(): Promise<Uint8Array> {\n // 网络字体未就绪时最多等待半秒;采集总超时仍由客户端统一控制。\n if (document.fonts) {\n let timeout: ReturnType<typeof setTimeout> | undefined\n try {\n await Promise.race([document.fonts.ready, new Promise<void>(resolve => timeout = setTimeout(resolve, 500))])\n }\n finally {\n clearTimeout(timeout)\n }\n }\n const { default: html2canvas } = await import('html2canvas')\n const canvas = await html2canvas(document.body, {\n width: window.innerWidth,\n height: window.innerHeight,\n scale: Math.min(1, 1920 / window.innerWidth, 1200 / window.innerHeight),\n // 原生 SVG foreignObject 保留 CSS mask 图标与字体基线,避免 CanvasRenderer 裁切文本。\n foreignObjectRendering: true,\n x: window.scrollX,\n y: window.scrollY,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n useCORS: false,\n allowTaint: false,\n logging: false,\n imageTimeout: 1000,\n ignoreElements: element => element.matches('[data-feedback-ignore],iframe,video'),\n onclone: (clone) => {\n // html2canvas 仍会预解析根背景;现代颜色先转为浏览器实际像素色,原页面不变。\n const colorCanvas = clone.createElement('canvas')\n colorCanvas.width = 1\n colorCanvas.height = 1\n const paint = colorCanvas.getContext('2d', { willReadFrequently: true })\n const colors = new Map<string, string>()\n if (paint && clone.defaultView) {\n for (const element of clone.querySelectorAll<HTMLElement>('*')) {\n const computed = clone.defaultView.getComputedStyle(element)\n for (const property of ['color', 'background-color', 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color', 'outline-color', 'text-decoration-color', '-webkit-text-stroke-color']) {\n const raw = computed.getPropertyValue(property)\n if (!/oklch|oklab|color\\(|lab\\(|lch\\(/i.test(raw))\n continue\n let normalized = colors.get(raw)\n if (!normalized) {\n paint.clearRect(0, 0, 1, 1)\n paint.fillStyle = raw\n paint.fillRect(0, 0, 1, 1)\n const pixel = paint.getImageData(0, 0, 1, 1).data\n normalized = `rgba(${pixel[0]},${pixel[1]},${pixel[2]},${pixel[3]! / 255})`\n colors.set(raw, normalized)\n }\n element.style.setProperty(property, normalized, 'important')\n }\n }\n }\n for (const element of clone.querySelectorAll<HTMLElement>(`${PRIVATE_SELECTOR},${CONTROL_SELECTOR}`)) {\n if (!clone.documentElement.contains(element))\n continue\n const bounds = element.getBoundingClientRect()\n const replacement = clone.createElement('div')\n // 普通输入控件保留边框、底色和布局,只替换内容;显式私密区域继续不可逆遮挡。\n const computed = clone.defaultView?.getComputedStyle(element)\n if (computed) {\n for (const property of Array.from(computed))\n replacement.style.setProperty(property, computed.getPropertyValue(property), 'important')\n }\n replacement.style.setProperty('width', `${bounds.width}px`, 'important')\n replacement.style.setProperty('height', `${bounds.height}px`, 'important')\n replacement.style.setProperty('box-sizing', 'border-box', 'important')\n replacement.style.setProperty('overflow', 'hidden', 'important')\n if (element.matches(PRIVATE_SELECTOR)) {\n replacement.style.setProperty('background', '#111', 'important')\n replacement.style.setProperty('color', 'transparent', 'important')\n }\n else {\n const control = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n const value = 'value' in control ? control.value : element.textContent\n replacement.textContent = value ? '••••' : element.getAttribute('placeholder') ?? ''\n }\n replacement.setAttribute('aria-hidden', 'true')\n element.replaceWith(replacement)\n }\n },\n })\n try {\n return await canvasBytes(canvas)\n }\n finally {\n canvas.width = 0\n canvas.height = 0\n }\n}\n\n/**\n * 将遮挡实际烧录进图片,导出时不携带可恢复的原图。\n * @example 模块内部上下文\n * ```ts\n * const input = await captureFeedbackScreenshot()\n * const output = await annotateFeedbackImage(input, { x: 10, y: 10, width: 40, height: 20, mode: 'mask' })\n * ```\n */\nexport async function annotateFeedbackImage(bytes: Uint8Array, annotation: FeedbackImageAnnotation): Promise<Uint8Array> {\n if (![annotation.x, annotation.y, annotation.width, annotation.height].every(Number.isFinite) || annotation.width <= 0 || annotation.height <= 0)\n throw new Error('Invalid annotation rectangle')\n const image = new Image()\n const imageUrl = URL.createObjectURL(new Blob([new Uint8Array(bytes)], { type: 'image/png' }))\n const canvas = document.createElement('canvas')\n try {\n image.src = imageUrl\n await image.decode()\n if (annotation.coordinateSpace === 'ratio') {\n if ([annotation.x, annotation.y, annotation.width, annotation.height].some(value => value < 0 || value > 1))\n throw new Error('Invalid annotation ratio')\n annotation = { ...annotation, x: annotation.x * image.naturalWidth, y: annotation.y * image.naturalHeight, width: annotation.width * image.naturalWidth, height: annotation.height * image.naturalHeight }\n }\n canvas.width = image.naturalWidth\n canvas.height = image.naturalHeight\n const context = canvas.getContext('2d')\n if (!context)\n throw new Error('Canvas is unavailable')\n context.drawImage(image, 0, 0)\n if (annotation.mode === 'mask') {\n context.fillStyle = '#111'\n // 向外覆盖完整像素,避免小数选区的抗锯齿透出敏感内容。\n const left = Math.floor(annotation.x)\n const top = Math.floor(annotation.y)\n context.fillRect(left, top, Math.ceil(annotation.x + annotation.width) - left, Math.ceil(annotation.y + annotation.height) - top)\n }\n else {\n context.strokeStyle = '#e11d48'\n context.lineWidth = 3\n context.strokeRect(annotation.x, annotation.y, annotation.width, annotation.height)\n }\n return await canvasBytes(canvas)\n }\n finally {\n URL.revokeObjectURL(imageUrl)\n canvas.width = 0\n canvas.height = 0\n }\n}\n\nasync function canvasBytes(canvas: HTMLCanvasElement): Promise<Uint8Array> {\n const blob = await new Promise<Blob>((resolve, reject) => canvas.toBlob(value => value ? resolve(value) : reject(new Error('Screenshot encoding failed')), 'image/png'))\n return new Uint8Array(await blob.arrayBuffer())\n}\n","import { core } from '@h-ai/core'\nimport { redactFeedbackText } from '../feedback-sanitize-text.js'\n\nconst CREDENTIAL_NAME = /authorization|password|passcode|secret|token|session|csrf|credential|api.?key|private.?key/i\n\n/**\n * 浏览器自由文本全文脱敏;附件总字节数由调用方限制,结构化字段自行裁剪。\n * @example 模块内部上下文\n * ```ts\n * const safeText = sanitizeFeedbackText('Request failed token=example-only')\n * void safeText\n * ```\n */\nexport function sanitizeFeedbackText(value: string): string {\n return redactFeedbackText(value).replace(/\\bhttps?:\\/\\/[^\\s<>\"']+/gi, url => core.sanitize.sanitizeUrl(url))\n}\n\n/**\n * 自由文本也在进入缓冲前脱敏;结构化字段规则复用 core。\n * @example 模块内部上下文\n * ```ts\n * const safe = sanitizeFeedbackData({ token: 'example-only', message: 'Request failed' })\n * ```\n */\nexport function sanitizeFeedbackData(value: unknown): Record<string, unknown> {\n const seen = new WeakSet<object>()\n function visit(input: unknown, depth: number): unknown {\n if (depth > 8)\n return '[TRUNCATED]'\n if (typeof input === 'string')\n return sanitizeFeedbackText(input).slice(0, 8192)\n if (input instanceof Error)\n return visit({ name: input.name, message: input.message, stack: input.stack }, depth + 1)\n if (!input || typeof input !== 'object')\n return input === undefined || typeof input === 'function' || typeof input === 'symbol' ? null : typeof input === 'bigint' ? String(input) : input\n if (seen.has(input))\n return '[CIRCULAR]'\n seen.add(input)\n if (Array.isArray(input))\n return input.slice(0, 200).map(item => visit(item, depth + 1))\n const output: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(input).slice(0, 100)) {\n if (['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n output[key] = CREDENTIAL_NAME.test(key) ? '[REDACTED]' : visit(item, depth + 1)\n }\n return output\n }\n const safe = core.sanitize.sanitizeSensitiveFields(visit(value, 0))\n return safe && typeof safe === 'object' && !Array.isArray(safe) ? safe as Record<string, unknown> : { value: safe }\n}\n\n/**\n * 保留 rrweb 的快照树结构;禁用脚本/导航及外部资源,避免离线查看访问生产网络。\n * @example 模块内部上下文\n * ```ts\n * const safe = sanitizeFeedbackReplay({ type: 2, data: { node: { tagName: 'div', attributes: {} } } })\n * ```\n */\nexport function sanitizeFeedbackReplay(value: unknown): Record<string, unknown> {\n function visit(input: unknown, depth: number): unknown {\n if (depth > 64)\n throw new Error('Replay snapshot exceeds depth limit')\n if (typeof input === 'string')\n return sanitizeFeedbackText(input)\n if (input === undefined)\n return null\n if (!input || typeof input !== 'object')\n return input\n if (Array.isArray(input))\n return input.map(item => visit(item, depth + 1))\n const output: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(input)) {\n if (['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n if (key === 'attributes' && item && typeof item === 'object') {\n const attributes: Record<string, unknown> = {}\n for (const [attribute, content] of Object.entries(item)) {\n if (/^on|^(?:srcdoc|action|formaction|href|srcset|rr_src)$/i.test(attribute) || CREDENTIAL_NAME.test(attribute))\n continue\n if (attribute === 'src' && typeof content === 'string' && !/^data:image\\/(?:png|jpeg|webp|gif);base64,/i.test(content)) {\n attributes['data-feedback-missing-resource'] = true\n continue\n }\n if ((attribute === 'style' || attribute === '_cssText') && typeof content === 'string') {\n attributes[attribute] = sanitizeFeedbackText(content).replace(/(?:url|@import)\\s*\\([^)]*\\)|@import\\s+[\"'][^\"']+[\"']/gi, '')\n attributes['data-feedback-missing-resource'] = true\n }\n else {\n attributes[attribute] = visit(content, depth + 1)\n }\n }\n output[key] = attributes\n }\n else if (key === 'textContent' && typeof item === 'string') {\n output[key] = sanitizeFeedbackText(item).replace(/(?:url|@import)\\s*\\([^)]*\\)|@import\\s+[\"'][^\"']+[\"']/gi, '')\n }\n else {\n output[key] = CREDENTIAL_NAME.test(key) ? '[REDACTED]' : visit(item, depth + 1)\n }\n }\n return output\n }\n return visit(value, 0) as Record<string, unknown>\n}\n\n/**\n * 只保留显式白名单中的普通业务 Cookie,永远拒绝凭证类名称。\n * @example 模块内部上下文\n * ```ts\n * const cookies = collectFeedbackCookies('theme=dark; access_token=example-only', ['theme'])\n * ```\n */\nexport function collectFeedbackCookies(cookie: string, allowlist: readonly string[]): Record<string, string> {\n const allowed = new Set(allowlist.filter(name => !CREDENTIAL_NAME.test(name)))\n const output: Record<string, string> = {}\n for (const pair of cookie.split(';')) {\n const separator = pair.indexOf('=')\n if (separator < 0)\n continue\n const name = pair.slice(0, separator).trim()\n if (!allowed.has(name))\n continue\n output[name] = redactFeedbackText(pair.slice(separator + 1).trim().slice(0, 256))\n }\n return output\n}\n\n/**\n * 默认 URL 不收集查询参数和 hash,避免未知业务隐私进入材料。\n * @example 模块内部上下文\n * ```ts\n * const page = feedbackPageUrl('https://example.test/orders?filter=mine')\n * ```\n */\nexport function feedbackPageUrl(raw: string): string {\n try {\n const url = new URL(raw)\n return `${url.origin}${url.pathname}`\n }\n catch {\n return '[INVALID_URL]'\n }\n}\n","import type { FeedbackEvidenceInput } from '@h-ai/api-contract/feedback'\nimport type { FeedbackDraft } from './feedback-client-types.js'\n\nconst STORE = 'drafts'\n\n/** 每个应用只保存一份有期限的脱敏现场,关闭窗口不自动丢弃待传材料。 */\nasync function withStore<T>(callback: (store: IDBObjectStore) => IDBRequest<T>): Promise<T> {\n const database = await new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open('hai-feedback-v1', 1)\n request.onupgradeneeded = () => request.result.createObjectStore(STORE)\n request.onerror = () => reject(request.error)\n request.onsuccess = () => resolve(request.result)\n })\n try {\n return await new Promise<T>((resolve, reject) => {\n const transaction = database.transaction(STORE, 'readwrite')\n const request = callback(transaction.objectStore(STORE))\n transaction.oncomplete = () => resolve(request.result)\n transaction.onerror = () => reject(transaction.error)\n transaction.onabort = () => reject(transaction.error)\n })\n }\n finally {\n database.close()\n }\n}\n\n/**\n * 保存已脱敏且有期限的待传现场。\n * @example 模块内部上下文\n * ```ts\n * async function persist(draft: FeedbackDraft) { await saveFeedbackDraft('orders:user-1', draft) }\n * ```\n */\nexport async function saveFeedbackDraft(appId: string, draft: FeedbackDraft): Promise<void> {\n await withStore(store => store.put(draft, appId))\n}\n\n/**\n * 读取同一身份范围的本机现场,过期数据立即清理。\n * @example 模块内部上下文\n * ```ts\n * const draft = await restoreFeedbackDraft('orders:user-1')\n * ```\n */\nexport async function restoreFeedbackDraft(appId: string): Promise<FeedbackDraft | undefined> {\n const value: unknown = await withStore(store => store.get(appId))\n if (!value || typeof value !== 'object' || !('expiresAt' in value) || typeof value.expiresAt !== 'number' || value.expiresAt <= Date.now()) {\n await withStore(store => store.delete(appId))\n return undefined\n }\n // 本机存储仍视为不可信,完整 schema 由调用方恢复前再次验证。\n return value as FeedbackDraft\n}\n\n/**\n * 持久化确认成功后删除草稿及旧检查点。\n * @example 模块内部上下文\n * ```ts\n * await deleteFeedbackDraft('orders:user-1')\n * ```\n */\nexport async function deleteFeedbackDraft(appId: string): Promise<void> {\n await withStore((store) => {\n store.delete(`${appId}:checkpoint`)\n return store.delete(appId)\n })\n}\n\n/**\n * 授权持久化时保存崩溃前的脱敏记录。\n * @example 模块内部上下文\n * ```ts\n * await saveFeedbackCheckpoint('orders:user-1', [])\n * ```\n */\nexport async function saveFeedbackCheckpoint(key: string, evidence: readonly FeedbackEvidenceInput[]): Promise<void> {\n await withStore(store => store.put({ evidence, expiresAt: Date.now() + 300_000 }, `${key}:checkpoint`))\n}\n\n/**\n * 恢复检查点,调用方仍须验证结构和期限。\n * @example 模块内部上下文\n * ```ts\n * const checkpoint = await restoreFeedbackCheckpoint('orders:user-1')\n * ```\n */\nexport async function restoreFeedbackCheckpoint(key: string): Promise<unknown> {\n return withStore(store => store.get(`${key}:checkpoint`))\n}\n","import type { FeedbackEvidenceInput, FeedbackReport } from '@h-ai/api-contract/feedback'\nimport type { HaiResult } from '@h-ai/core'\nimport type { FeedbackBrowserClient, FeedbackClientAttachment, FeedbackClientConfig, FeedbackClientSubmitInput, FeedbackDraft } from './feedback-client-types.js'\nimport { FeedbackBudgetSchema, FeedbackEvidenceInputSchema, FeedbackReportSchema, FeedbackSubmitInputSchema, resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\nimport { core, err, ok } from '@h-ai/core'\nimport { feedbackM } from '../feedback-i18n.js'\nimport { HaiFeedbackError } from '../feedback-types.js'\nimport { saveFeedbackFile } from './feedback-client-files.js'\nimport { annotateFeedbackImage, captureFeedbackScreenshot } from './feedback-client-image.js'\nimport { collectFeedbackCookies, feedbackPageUrl, sanitizeFeedbackData, sanitizeFeedbackReplay, sanitizeFeedbackText } from './feedback-client-sanitize.js'\nimport { deleteFeedbackDraft, restoreFeedbackCheckpoint, restoreFeedbackDraft, saveFeedbackCheckpoint, saveFeedbackDraft } from './feedback-client-store.js'\n\n/** 系统文件关联可能不提供 MIME;只对空值和通用二进制类型按受支持扩展名补齐。 */\nfunction feedbackFileContentType(file: File): string | undefined {\n const type = file.type.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n const extensions = new Map([\n ['png', 'image/png'],\n ['jpg', 'image/jpeg'],\n ['jpeg', 'image/jpeg'],\n ['webp', 'image/webp'],\n ['webm', 'video/webm'],\n ['mp4', 'video/mp4'],\n ['txt', 'text/plain'],\n ['log', 'text/plain'],\n ['json', 'application/json'],\n ['pdf', 'application/pdf'],\n ['zip', 'application/zip'],\n ['gz', 'application/gzip'],\n ['tgz', 'application/gzip'],\n ])\n if (!type || type === 'application/octet-stream')\n return extensions.get(file.name.split('.').at(-1)?.toLowerCase() ?? '')\n const aliases = new Map([\n ['image/x-png', 'image/png'],\n ['image/jpg', 'image/jpeg'],\n ['image/pjpeg', 'image/jpeg'],\n ['text/json', 'application/json'],\n ['text/x-log', 'text/plain'],\n ['application/x-pdf', 'application/pdf'],\n ['application/x-zip-compressed', 'application/zip'],\n ['application/x-gzip', 'application/gzip'],\n ])\n const normalized = aliases.get(type) ?? type\n return [...extensions.values()].includes(normalized) ? normalized : undefined\n}\n\n/**\n * 创建独立浏览器采集会话;默认不持久化、不录制页面回放,不采集请求正文。\n * @example\n * ```ts\n * import { createFeedbackClient } from '@h-ai/feedback/client'\n * const client = createFeedbackClient()\n * const draft = client.getDraft()\n * await client.close()\n * ```\n */\nexport function createFeedbackClient(): FeedbackBrowserClient {\n let config: FeedbackClientConfig | undefined\n let draft: FeedbackDraft | undefined\n let sessionVersion = 0\n let policyVerified = false\n let preparedPage = ''\n let budget = resolveFeedbackBudget()\n const previews = new Map<string, { checksum: string, url: string }>()\n let discardOnClose = false\n let saveController = new AbortController()\n\n function releasePreviews() {\n for (const preview of previews.values()) URL.revokeObjectURL(preview.url)\n previews.clear()\n }\n\n function getView() {\n const files = draft?.attachments ?? []\n for (const [id, preview] of previews) {\n if (!files.some(file => file.id === id && file.checksum === preview.checksum)) {\n URL.revokeObjectURL(preview.url)\n previews.delete(id)\n }\n }\n return { attachments: files.map((file) => {\n let preview = previews.get(file.id)\n if (!preview) {\n preview = { checksum: file.checksum, url: URL.createObjectURL(new Blob([new Uint8Array(file.bytes).buffer], { type: file.contentType })) }\n previews.set(file.id, preview)\n }\n return { id: file.id, name: file.name, size: file.size, mimeType: file.contentType, url: preview.url }\n }), evidence: draft?.evidence ?? [], missing: draft?.missing ?? [], budget: { ...budget } }\n }\n let initializing = false\n let sequence = 0\n let buffer: FeedbackEvidenceInput[] = []\n let bufferBytes = 0\n let dropped = 0\n let lastError: FeedbackEvidenceInput | undefined\n let errorWindows: Array<{ anchor: FeedbackEvidenceInput, evidence: FeedbackEvidenceInput[], after: number, deadline: number, bytes: number }> = []\n let afterCount = 0\n let deadline = 0\n let initialIds = new Set<string>()\n const uploadedIds = new Set<string>()\n let flushPromise: Promise<HaiResult<void>> | undefined\n let preparePromise: Promise<HaiResult<FeedbackDraft>> | undefined\n let persistTimer: ReturnType<typeof setTimeout> | undefined\n let flushTimer: ReturnType<typeof setInterval> | undefined\n let stopReplay: (() => void) | undefined\n let screenshotCaptures = 0\n let unsubscribeLogger: (() => void) | undefined\n let source = ''\n let keyScreenshots: Array<{ attachment: FeedbackClientAttachment, timestamp: number }> = []\n let lastKeyScreenshot = 0\n let keyScreenshotPromise: Promise<void> | undefined\n let closing = false\n let closePromise: Promise<void> | undefined\n let collectionFinished = false\n let collectionSealed = false\n let draftBytes = 0\n let storageKey = ''\n const cleanups: Array<() => void> = []\n const missing = new Set<string>()\n let replayChunks: FeedbackEvidenceInput[][] = []\n\n function failure(code: keyof typeof HaiFeedbackError = 'OPERATION_FAILED', cause?: unknown, message?: string) {\n const key = code === 'NOT_INITIALIZED' ? 'feedback_notInitialized' : code === 'LIMIT_EXCEEDED' ? 'feedback_limitExceeded' : code === 'INVALID_INPUT' ? 'feedback_invalidInput' : 'feedback_operationFailed'\n const traceId = core.context.get().traceId ?? core.context.get().requestId ?? core.id.uuid()\n const error = { ...HaiFeedbackError[code], traceId, message: message ?? feedbackM(key), cause }\n core.logger[cause === undefined ? 'warn' : 'error']('Feedback client operation failed', { module: 'feedback', traceId, error })\n return err({ ...error, message: core.error.formatMessage(error) })\n }\n\n function limits() {\n return { events: Math.min(config?.maxEvents ?? 1000, budget.maxEvidenceCount), bytes: Math.min(config?.maxBytes ?? 2 * 1024 * 1024, budget.maxEvidenceBytes), age: config?.maxAgeMs ?? 300_000, before: config?.beforeCount ?? 100, after: config?.afterCount ?? 100 }\n }\n\n function schedulePersist() {\n if (!config?.persistDraft || persistTimer)\n return\n persistTimer = setTimeout(() => {\n persistTimer = undefined\n if (config && draft && !collectionFinished)\n void saveFeedbackDraft(storageKey, draft).catch(() => missing.add('browser-persistence-unavailable'))\n else if (config)\n void saveFeedbackCheckpoint(storageKey, buffer).catch(() => missing.add('browser-persistence-unavailable'))\n }, 200)\n }\n\n function record(event: { kind: FeedbackEvidenceInput['kind'], data: Record<string, unknown>, requestId?: string, errorId?: string }) {\n if (!config || closing)\n return\n const entry = FeedbackEvidenceInputSchema.safeParse({\n id: core.id.uuid(),\n source,\n sequence: ++sequence,\n kind: event.kind,\n timestamp: Date.now(),\n requestId: event.requestId,\n errorId: event.kind === 'error' || (event.kind === 'request' && event.data.success === false) ? event.errorId ?? core.id.uuid() : event.errorId,\n data: sanitizeFeedbackData(event.data),\n })\n if (!entry.success)\n return\n const item = entry.data\n const size = new TextEncoder().encode(JSON.stringify(item)).byteLength\n const bounds = limits()\n if (size > Math.min(bounds.bytes, 64 * 1024)) {\n dropped++\n return\n }\n buffer.push(item)\n bufferBytes += size\n while (buffer.length > bounds.events || bufferBytes > bounds.bytes || (buffer[0]?.timestamp ?? 0) < Date.now() - bounds.age) {\n const removed = buffer.shift()\n if (removed)\n bufferBytes -= new TextEncoder().encode(JSON.stringify(removed)).byteLength\n dropped++\n }\n const logEntry = item.kind === 'log' || item.kind === 'error'\n if (logEntry) {\n for (const window of errorWindows) {\n if (item.timestamp <= window.deadline && window.after < bounds.after) {\n window.evidence.push(item)\n window.after++\n window.bytes += size\n }\n }\n }\n if (item.kind === 'error' || (item.kind === 'request' && item.data.success === false)) {\n lastError = item\n const before = buffer.filter(entry => (entry.kind === 'log' || entry.kind === 'error') && entry.id !== item.id)\n const evidence = [...before.slice(Math.max(0, before.length - bounds.before)), item]\n errorWindows.push({ anchor: item, evidence, after: 0, deadline: item.timestamp + (config.afterTimeoutMs ?? 30_000), bytes: new TextEncoder().encode(JSON.stringify(evidence)).byteLength })\n void captureKeyScreenshot()\n }\n errorWindows = errorWindows.filter(window => window.anchor.timestamp >= Date.now() - bounds.age)\n while (errorWindows.length > 10 || errorWindows.reduce((total, window) => total + window.evidence.length, 0) > bounds.events || errorWindows.reduce((total, window) => total + window.bytes, 0) > bounds.bytes) {\n errorWindows.shift()\n missing.add('browser-error-windows-truncated')\n }\n schedulePersist()\n appendToDraft(item, size)\n }\n\n function appendToDraft(item: FeedbackEvidenceInput, size: number) {\n const bounds = limits()\n if (draft && !collectionFinished && !collectionSealed && ((Date.now() <= deadline && afterCount < bounds.after) || item.kind === 'environment') && draft.evidence.length < bounds.events && draftBytes + size <= bounds.bytes) {\n draft.evidence.push(item)\n draftBytes += size\n if (item.kind === 'log' || item.kind === 'error')\n afterCount++\n schedulePersist()\n }\n }\n\n function listen<K extends keyof WindowEventMap>(name: K, callback: (event: WindowEventMap[K]) => void) {\n window.addEventListener(name, callback)\n cleanups.push(() => window.removeEventListener(name, callback))\n }\n\n async function init(input: FeedbackClientConfig): Promise<HaiResult<void>> {\n if (initializing)\n return err(HaiFeedbackError.INIT_IN_PROGRESS, feedbackM('feedback_initInProgress'))\n initializing = true\n try {\n if (config || closePromise)\n await close()\n if (typeof window === 'undefined' || !input.appId || !input.actions || ['submit', 'appendEvidence', 'completeCollection', 'upload'].some(key => typeof input.actions[key as keyof typeof input.actions] !== 'function'))\n return failure('INVALID_INPUT')\n const numeric = [input.maxEvents, input.maxBytes, input.maxAgeMs, input.beforeCount, input.afterCount, input.afterTimeoutMs, input.screenshotTimeoutMs, input.maxKeyScreenshots, input.keyScreenshotThrottleMs]\n if (numeric.some(value => value !== undefined && (!Number.isSafeInteger(value) || value < 0)) || (input.persistDraft && !input.persistenceKey))\n return failure('INVALID_INPUT')\n if (!FeedbackSubmitInputSchema.pick({ appId: true, appVersion: true, buildId: true, commit: true }).safeParse({ appId: input.appId, appVersion: input.appVersion, buildId: input.buildId, commit: input.commit }).success)\n return failure('INVALID_INPUT')\n const initVersion = sessionVersion\n const policy = input.actions.policy ? await input.actions.policy().catch(() => failure('OPERATION_FAILED')) : ok(input.budget ?? resolveFeedbackBudget())\n if (initVersion !== sessionVersion)\n return failure('NOT_INITIALIZED')\n policyVerified = policy.success\n budget = FeedbackBudgetSchema.parse(policy.success ? policy.data : input.budget ?? resolveFeedbackBudget())\n if (!policy.success)\n missing.add('server-policy-unavailable')\n config = input\n saveController = new AbortController()\n closing = false\n source = `browser:${core.id.uuid()}`\n storageKey = `${input.appId}:${input.persistenceKey ?? ''}`\n if (input.persistDraft) {\n try {\n const restored = await restoreFeedbackDraft(storageKey)\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n if (restored && Array.isArray(restored.evidence) && restored.evidence.every(item => FeedbackEvidenceInputSchema.safeParse(item).success)\n && Array.isArray(restored.attachments) && restored.attachments.every(item => item.bytes instanceof Uint8Array)\n && (!restored.report || FeedbackReportSchema.safeParse(restored.report).success)) {\n draft = restored\n missing.add('browser-session-interrupted')\n deadline = Date.now()\n }\n else {\n const checkpoint = await restoreFeedbackCheckpoint(storageKey)\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n if (checkpoint && typeof checkpoint === 'object' && 'evidence' in checkpoint && Array.isArray(checkpoint.evidence) && 'expiresAt' in checkpoint && typeof checkpoint.expiresAt === 'number' && checkpoint.expiresAt > Date.now()) {\n const parsed = checkpoint.evidence.map(item => FeedbackEvidenceInputSchema.safeParse(item))\n if (parsed.every(item => item.success)) {\n buffer = parsed.filter(item => item.success).map(item => item.data)\n bufferBytes = new TextEncoder().encode(JSON.stringify(buffer)).byteLength\n sequence = Math.max(0, ...buffer.map(item => item.sequence))\n lastError = buffer.filter(item => item.kind === 'error' || (item.kind === 'request' && item.data.success === false)).at(-1)\n missing.add('browser-session-interrupted')\n missing.add('previous-page-screenshot-unavailable')\n }\n }\n }\n }\n catch {\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n missing.add('browser-persistence-unavailable')\n }\n }\n unsubscribeLogger = core.logger.observe((entry) => {\n if (entry.context.module === 'feedback' || entry.context.feedback === true)\n return\n record({ kind: ['error', 'fatal'].includes(entry.level) ? 'error' : 'log', requestId: typeof entry.context.requestId === 'string' ? entry.context.requestId : typeof entry.context.traceId === 'string' ? entry.context.traceId : undefined, data: { level: entry.level, message: entry.message, context: entry.context } })\n })\n listen('error', event => record({ kind: 'error', data: { message: event.message, stack: event.error instanceof Error ? event.error.stack : undefined, filename: feedbackPageUrl(event.filename || location.href), line: event.lineno, column: event.colno } }))\n listen('unhandledrejection', event => record({ kind: 'error', data: { reason: event.reason } }))\n const click = (event: MouseEvent) => {\n if (!(event.target instanceof Element) || event.target.closest('[data-feedback-ignore]'))\n return\n const target = event.target.closest('[data-feedback-action],button,a')\n if (target && !target.closest('[data-feedback-private]')) {\n record({ kind: 'interaction', data: { action: target.getAttribute('data-feedback-action') ?? target.tagName.toLowerCase(), route: location.pathname } })\n if (target.hasAttribute('data-feedback-action'))\n void captureKeyScreenshot()\n }\n }\n document.addEventListener('click', click, true)\n cleanups.push(() => document.removeEventListener('click', click, true))\n if (input.captureConsole) {\n for (const level of ['debug', 'info', 'warn', 'error'] as const) {\n const original = globalThis.console[level]\n const wrapper: typeof original = (...args) => {\n record({ kind: level === 'error' ? 'error' : 'log', data: { channel: 'console', level, arguments: args } })\n original.apply(globalThis.console, args)\n }\n globalThis.console[level] = wrapper\n cleanups.push(() => {\n if (globalThis.console[level] === wrapper)\n globalThis.console[level] = original\n })\n }\n }\n listen('pagehide', () => {\n deadline = Date.now()\n if (input.persistDraft && draft)\n void saveFeedbackDraft(storageKey, draft).catch(() => missing.add('browser-persistence-unavailable'))\n else if (input.persistDraft)\n void saveFeedbackCheckpoint(storageKey, buffer).catch(() => missing.add('browser-persistence-unavailable'))\n void flush()\n })\n if (input.replay)\n await startReplay(input)\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n flushTimer = setInterval(() => {\n if (draft?.report)\n void flush()\n }, 1000)\n return ok(undefined)\n }\n catch (cause) {\n await close()\n return failure('OPERATION_FAILED', cause)\n }\n finally {\n initializing = false\n }\n }\n\n async function startReplay(activeConfig: FeedbackClientConfig) {\n try {\n const { record: start } = await import('@rrweb/record')\n if (closing || config !== activeConfig || screenshotCaptures || stopReplay)\n return\n let firstEvent = true\n stopReplay = start({\n maskAllInputs: true,\n maskTextSelector: '[data-feedback-private],.rr-mask',\n blockSelector: '[data-feedback-ignore],[data-feedback-private],.rr-block,iframe,canvas,video',\n // rrweb 内联跨域图像会修改原 img 的 crossOrigin,可能破坏带凭据的头像等资源。\n inlineImages: false,\n inlineStylesheet: true,\n collectFonts: false,\n checkoutEveryNms: 30_000,\n emit: (event, isCheckout) => {\n if (firstEvent || isCheckout || replayChunks.length === 0)\n replayChunks.push([])\n firstEvent = false\n let payload: Record<string, unknown>\n try {\n payload = sanitizeFeedbackReplay(event)\n }\n catch {\n missing.add('replay-snapshot-truncated')\n return\n }\n const safe = FeedbackEvidenceInputSchema.safeParse({ id: core.id.uuid(), source, sequence: ++sequence, kind: 'replay', timestamp: Date.now(), data: { event: payload } })\n if (!safe.success)\n return\n replayChunks.at(-1)?.push(safe.data)\n appendToDraft(safe.data, new TextEncoder().encode(JSON.stringify(safe.data)).byteLength)\n while (replayChunks.length > 2)\n replayChunks.shift()\n const count = replayChunks.reduce((total, chunk) => total + chunk.length, 0)\n const bytes = new TextEncoder().encode(JSON.stringify(replayChunks)).byteLength\n if (count > limits().events || bytes > limits().bytes) {\n replayChunks = []\n missing.add('replay-capacity-exceeded')\n }\n },\n }) ?? undefined\n }\n catch {\n if (!closing && config === activeConfig)\n missing.add('replay-recorder-unavailable')\n }\n }\n\n function captureKeyScreenshot(): Promise<void> {\n if (!config || config.screenshot === false || config.keyScreenshots === false || config.maxKeyScreenshots === 0 || keyScreenshotPromise || Date.now() - lastKeyScreenshot < (config.keyScreenshotThrottleMs ?? 10_000))\n return keyScreenshotPromise ?? Promise.resolve()\n const activeConfig = config\n lastKeyScreenshot = Date.now()\n keyScreenshotPromise = (async () => {\n try {\n const bytes = await takeScreenshot(activeConfig)\n if (closing || config !== activeConfig)\n return\n if (bytes.byteLength > budget.maxAttachmentBytes) {\n missing.add('key-screenshot-size-limit-exceeded')\n return\n }\n const image = await attachment(`operation-${lastKeyScreenshot}.png`, 'image/png', bytes)\n if (closing || config !== activeConfig)\n return\n keyScreenshots.push({ attachment: image, timestamp: lastKeyScreenshot })\n keyScreenshots = keyScreenshots.filter(item => item.timestamp >= Date.now() - limits().age).slice(-Math.min(activeConfig.maxKeyScreenshots ?? 3, 5))\n }\n catch {\n if (!closing && config === activeConfig)\n missing.add('key-screenshot-unavailable')\n }\n })().finally(() => {\n keyScreenshotPromise = undefined\n })\n return keyScreenshotPromise\n }\n\n function takeScreenshot(activeConfig: FeedbackClientConfig): Promise<Uint8Array> {\n // rrweb 即使遮挡 iframe 也会观察其文档。暂停自己的记录器,避免采集 html2canvas 的克隆及样式变更。\n screenshotCaptures++\n stopReplay?.()\n stopReplay = undefined\n const captured = (async () => {\n try {\n return await (activeConfig.captureScreenshot?.() ?? captureFeedbackScreenshot())\n }\n finally {\n screenshotCaptures--\n if (!screenshotCaptures && !closing && config === activeConfig && activeConfig.replay)\n await startReplay(activeConfig)\n }\n })()\n return bounded(captured, activeConfig.screenshotTimeoutMs ?? 3000)\n }\n\n async function doPrepare(): Promise<HaiResult<FeedbackDraft>> {\n if (!config || closing)\n return failure('NOT_INITIALIZED')\n const activeConfig = config\n if (draft?.report && !collectionFinished) {\n // 新反馈开始前先确认上一份待传材料,不能以关闭弹窗丢弃附件。\n if (Date.now() < deadline && afterCount < limits().after)\n draft.missing.push('collection-ended-by-new-feedback')\n deadline = Date.now()\n const settled = await flush()\n if (!settled.success)\n return settled\n if (closing || config !== activeConfig)\n return failure('NOT_INITIALIZED')\n }\n if (draft && !collectionFinished) {\n if (!draft.submission && config.screenshot !== false && preparedPage !== pageIdentity()) {\n const captured = await captureScreenshot()\n if (!captured.success)\n return captured\n }\n return ok(draft)\n }\n collectionFinished = false\n collectionSealed = false\n initialIds.clear()\n uploadedIds.clear()\n const now = Date.now()\n buffer = buffer.filter(item => item.timestamp >= now - limits().age)\n bufferBytes = new TextEncoder().encode(JSON.stringify(buffer)).byteLength\n errorWindows = errorWindows.filter(window => window.anchor.timestamp >= now - limits().age)\n const frozenWindow = errorWindows.at(-1)\n const anchor = frozenWindow?.anchor ?? (lastError && lastError.timestamp >= now - limits().age && buffer.some(item => item.id === lastError?.id) ? lastError : undefined)\n const logs = buffer.filter(item => item.kind === 'log' || item.kind === 'error')\n const anchorIndex = anchor ? logs.findIndex(item => item.id === anchor.id) : logs.length\n const anchorIndexes = anchor ? logs.map((item, index) => item.kind === 'error' ? index : -1).filter(index => index >= 0).slice(-10) : []\n const selectedIds = new Set<string>()\n const selected = anchor\n ? (errorWindows.length ? errorWindows.flatMap(window => window.evidence) : anchorIndexes.flatMap(index => logs.slice(Math.max(0, index - limits().before), index + 1 + limits().after))).filter((item) => {\n if (selectedIds.has(item.id))\n return false\n selectedIds.add(item.id)\n return true\n }).sort((a, b) => a.sequence - b.sequence)\n : logs.slice(Math.max(0, logs.length - limits().before))\n const other = buffer.filter(item => item.kind !== 'log' && item.kind !== 'error').slice(-100)\n if (keyScreenshotPromise)\n await keyScreenshotPromise\n if (closing || config !== activeConfig)\n return failure('NOT_INITIALIZED')\n keyScreenshots = keyScreenshots.filter(item => item.timestamp >= now - limits().age)\n draft = { submissionId: core.id.uuid(), anchorTime: anchor?.timestamp ?? now, anchorKind: anchor ? 'error' : 'feedback', errorId: anchor?.errorId, evidence: [...selected, ...other, ...replayChunks.flat()].sort((a, b) => a.sequence - b.sequence), attachments: [], missing: [...missing], expiresAt: now + 86_400_000 }\n while (draft.evidence.length > limits().events || new TextEncoder().encode(JSON.stringify(draft.evidence)).byteLength > limits().bytes) {\n draft.evidence.shift()\n missing.add('browser-draft-truncated')\n }\n draftBytes = new TextEncoder().encode(JSON.stringify(draft.evidence)).byteLength\n if (dropped)\n draft.missing.push(`browser-buffer-truncated:${dropped}`)\n afterCount = frozenWindow?.after ?? (anchor ? Math.max(0, logs.length - anchorIndex - 1) : 0)\n deadline = (anchor?.timestamp ?? now) + (config.afterTimeoutMs ?? 30_000)\n recordEnvironment()\n if (config.screenshot !== false) {\n const current = draft\n const captured = await captureScreenshot(undefined, 'screenshot.png')\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (!captured.success) {\n current.missing.push(captured.error.code === HaiFeedbackError.LIMIT_EXCEEDED.code ? 'screenshot-size-limit-exceeded' : 'screenshot-unavailable')\n current.missing.push(`screenshot-error:${captured.error.message.slice(0, 300)}`)\n }\n }\n // 当前页面优先占预算,历史关键帧只能使用剩余额度。\n for (const { attachment: image } of keyScreenshots) {\n if (image.size > budget.maxAttachmentBytes || draft.attachments.length >= budget.maxAttachmentCount || draft.attachments.reduce((sum, file) => sum + file.size, image.size) > budget.maxAttachmentsBytes)\n draft.missing.push('key-screenshot-budget-exceeded')\n else draft.attachments.push(image)\n }\n schedulePersist()\n preparedPage = pageIdentity()\n return ok(draft)\n }\n\n function prepare(): Promise<HaiResult<FeedbackDraft>> {\n preparePromise ??= doPrepare().finally(() => {\n preparePromise = undefined\n })\n return preparePromise\n }\n\n function recordEnvironment() {\n if (!config)\n return\n record({ kind: 'environment', data: { appId: config.appId, appVersion: config.appVersion, buildId: config.buildId, commit: config.commit, url: feedbackPageUrl(location.href), browser: navigator.userAgent, language: navigator.language, timezone: new Intl.DateTimeFormat().resolvedOptions().timeZone, viewport: { width: innerWidth, height: innerHeight, pixelRatio: devicePixelRatio }, online: navigator.onLine, cookies: collectFeedbackCookies(document.cookie, config.cookieAllowlist ?? []) } })\n }\n\n /** Hash 路由只在会话内用于换页识别,不把片段中的参数写入诊断材料。 */\n function pageIdentity() {\n return `${location.origin}${location.pathname}${location.hash.startsWith('#/') ? location.hash.split('?')[0] : ''}`\n }\n\n async function captureScreenshot(attachmentId?: string, name?: string): Promise<HaiResult<void>> {\n if (!config || !draft || closing)\n return failure('NOT_INITIALIZED')\n const current = draft\n const activeConfig = config\n const previous = attachmentId ? current.attachments.find(item => item.id === attachmentId) : undefined\n const previousChecksum = previous?.checksum\n if (current.submission)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n if (attachmentId && (!previous || !previous.contentType.startsWith('image/')))\n return failure('INVALID_INPUT')\n if (!previous && current.attachments.length >= budget.maxAttachmentCount)\n return failure('LIMIT_EXCEEDED')\n try {\n const bytes = await takeScreenshot(activeConfig)\n if (bytes.byteLength > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const previousName = previous && (/\\.[^.]+$/.test(previous.name) ? previous.name.replace(/\\.[^.]+$/, '.png') : `${previous.name}.png`)\n const image = await attachment(name ?? previousName ?? `screenshot-${core.id.uuid()}.png`, 'image/png', bytes)\n if (closing || config !== activeConfig || draft !== current || current.submission || (previous && (!current.attachments.includes(previous) || previous.checksum !== previousChecksum)))\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n if (current.attachments.reduce((total, item) => total + (item === previous ? 0 : item.size), image.size) > budget.maxAttachmentsBytes)\n return failure('LIMIT_EXCEEDED')\n if (previous)\n current.attachments = current.attachments.map(item => item === previous ? { ...image, id: previous.id } : item)\n else if (current.attachments.length < budget.maxAttachmentCount)\n current.attachments.unshift(image)\n else\n return failure('LIMIT_EXCEEDED')\n if (!name)\n recordEnvironment()\n preparedPage = pageIdentity()\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n async function submit(input: FeedbackClientSubmitInput = {}): Promise<HaiResult<FeedbackReport>> {\n if (!config || closing)\n return failure('NOT_INITIALIZED')\n const activeConfig = config\n const prepared = preparePromise ? await preparePromise : draft ? ok(draft) : await prepare()\n if (!prepared.success)\n return prepared\n const current = prepared.data\n try {\n if (!policyVerified && activeConfig.actions.policy) {\n const policy = await activeConfig.actions.policy()\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (!policy.success)\n return policy\n budget = FeedbackBudgetSchema.parse(policy.data)\n policyVerified = true\n missing.delete('server-policy-unavailable')\n current.missing = current.missing.filter(reason => reason !== 'server-policy-unavailable')\n while (current.evidence.length && (current.evidence.length > limits().events || new TextEncoder().encode(JSON.stringify(current.evidence)).byteLength > limits().bytes)) {\n current.evidence.shift()\n if (!current.missing.includes('browser-draft-truncated'))\n current.missing.push('browser-draft-truncated')\n }\n draftBytes = new TextEncoder().encode(JSON.stringify(current.evidence)).byteLength\n }\n const fingerprint = await digestHex(new TextEncoder().encode(JSON.stringify({ description: sanitizeFeedbackData({ text: input.description ?? '' }).text, category: input.category ?? '', contact: sanitizeFeedbackData({ text: input.contact ?? '' }).text, files: (input.files ?? []).map(item => ({ name: item.name, size: item.size, lastModified: item.lastModified })), removed: [...(input.removedAttachmentIds ?? [])].sort() })))\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (current.submission && current.userInputFingerprint && fingerprint !== current.userInputFingerprint)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n if (!current.submission && input.removedAttachmentIds?.length)\n current.attachments = current.attachments.filter(item => !input.removedAttachmentIds?.includes(item.id))\n if (!current.submission) {\n const added = await addFiles(input.files ?? [])\n if (!added.success)\n return added\n }\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n current.submission ??= FeedbackSubmitInputSchema.parse({ submissionId: current.submissionId, appId: config.appId, appVersion: config.appVersion, buildId: config.buildId, commit: config.commit, description: typeof input.description === 'string' ? String(sanitizeFeedbackData({ text: input.description }).text) : undefined, category: input.category, contact: input.contact, url: feedbackPageUrl(location.href), anchor: { kind: current.anchorKind, timestamp: current.anchorTime, errorId: current.errorId }, evidence: current.evidence, attachments: current.attachments.map(({ bytes: _bytes, ...metadata }) => metadata) })\n current.userInputFingerprint = fingerprint\n schedulePersist()\n const result = await activeConfig.actions.submit(current.submission)\n if (!result.success)\n return result\n if (closing || config !== activeConfig || draft !== current)\n return result\n current.report = result.data\n initialIds = new Set(current.submission.evidence?.map(item => item.id))\n schedulePersist()\n // 已受理立即返回;大附件和后续日志由可重试的后台 flush 续传。\n void flush()\n return result\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n async function doFlush(): Promise<HaiResult<void>> {\n if (!config || !draft?.report)\n return failure('NOT_INITIALIZED')\n if (collectionFinished)\n return ok(undefined)\n try {\n for (const item of draft.attachments) {\n if (uploadedIds.has(item.id))\n continue\n const result = await config.actions.upload({ id: draft.report.id, attachmentId: item.id, dataBase64: base64(item.bytes) })\n if (!result.success)\n return result\n uploadedIds.add(item.id)\n }\n let drainPasses = 0\n while (true) {\n if (closing || Date.now() >= deadline || afterCount >= limits().after)\n collectionSealed = true\n const pending = draft.evidence.filter(item => !initialIds.has(item.id)).slice(0, 200)\n if (pending.length === 0)\n break\n const result = await config.actions.appendEvidence({ id: draft.report.id, evidence: pending })\n if (!result.success)\n return result\n for (const id of result.data.acknowledged)\n initialIds.add(id)\n if (pending.some(item => !initialIds.has(item.id)))\n return failure()\n drainPasses++\n if (drainPasses >= budget.maxAttachmentCount)\n return ok(undefined)\n }\n if (collectionSealed) {\n const result = await config.actions.completeCollection({ id: draft.report.id, missing: [...new Set([...draft.missing, ...missing])] })\n if (!result.success)\n return result\n collectionFinished = true\n const updatedReport = FeedbackReportSchema.safeParse(result.data)\n if (updatedReport.success)\n draft.report = updatedReport.data\n if (config.persistDraft)\n await deleteFeedbackDraft(storageKey)\n }\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n function flush(): Promise<HaiResult<void>> {\n flushPromise ??= doFlush().finally(() => {\n flushPromise = undefined\n })\n return flushPromise\n }\n\n async function annotate(id: string, mark: Parameters<typeof annotateFeedbackImage>[1]): Promise<HaiResult<void>> {\n if (!draft || closing)\n return failure('NOT_INITIALIZED')\n const current = draft\n const item = current.attachments.find(value => value.id === id)\n if (!item || current.submission)\n return failure('INVALID_INPUT')\n const originalBytes = item.bytes\n try {\n const bytes = await annotateFeedbackImage(originalBytes, mark)\n const name = /\\.[^.]+$/.test(item.name) ? item.name.replace(/\\.[^.]+$/, '.png') : `${item.name}.png`\n const updated = await attachment(name, 'image/png', bytes)\n if (updated.size > budget.maxAttachmentBytes || current.attachments.reduce((sum, file) => sum + (file === item ? 0 : file.size), updated.size) > budget.maxAttachmentsBytes)\n return failure('LIMIT_EXCEEDED')\n // 渲染/摘要结束后再原子替换;提交、关闭、删除或另一标注不能被旧异步结果覆盖。\n if (closing || draft !== current || current.submission || !current.attachments.includes(item) || item.bytes !== originalBytes)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n Object.assign(item, updated, { id })\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n async function addFiles(files: readonly File[], removedAttachmentIds: readonly string[] = []): Promise<HaiResult<void>> {\n if (!draft)\n return failure('NOT_INITIALIZED')\n if (draft.submission && (files.length || removedAttachmentIds.length))\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n const current = draft\n const items: FeedbackClientAttachment[] = []\n const newMissing: string[] = []\n try {\n for (const file of files) {\n if (items.length >= budget.maxAttachmentCount || file.size > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const contentType = feedbackFileContentType(file)\n if (!contentType)\n return failure('INVALID_INPUT', undefined, feedbackM('feedback_unsupportedAttachmentType'))\n let bytes: Uint8Array\n if (contentType.startsWith('text/') || contentType === 'application/json') {\n const raw = await file.text()\n if (contentType === 'application/json' && raw.length > 8192)\n newMissing.push(`attachment-text-truncated:${String(sanitizeFeedbackData({ text: file.name }).text).slice(0, 100)}`)\n bytes = contentType === 'application/json'\n ? new TextEncoder().encode(JSON.stringify(sanitizeFeedbackData(JSON.parse(raw))))\n : new TextEncoder().encode(sanitizeFeedbackText(raw))\n }\n else {\n bytes = new Uint8Array(await file.arrayBuffer())\n }\n if (bytes.byteLength > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const item = await attachment(file.name, contentType, bytes)\n if (!items.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n items.push(item)\n }\n // 读取/摘要计算期间草稿可能切换或冻结;失败批次不能留下附件或缺失标记。\n if (draft !== current || closing)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n if (current.submission && (files.length || removedAttachmentIds.length))\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n // 在最新附件上合并,保留读取期间另一成功批次的新增项;最终校验与提交之间没有 await。\n const merged = current.attachments.filter(file => !removedAttachmentIds.includes(file.id))\n for (const item of items) {\n if (!merged.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n merged.push(item)\n }\n if (merged.length > budget.maxAttachmentCount || merged.reduce((total, item) => total + item.size, 0) > budget.maxAttachmentsBytes)\n return failure('LIMIT_EXCEEDED')\n current.attachments = merged\n current.missing.push(...newMissing)\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('INVALID_INPUT', cause)\n }\n }\n\n async function exportDraft(input: FeedbackClientSubmitInput = {}): Promise<HaiResult<Uint8Array>> {\n if (!draft)\n return failure('NOT_INITIALIZED')\n try {\n const { createFeedbackBundle } = await import('../bundle/index.js')\n const attachments = [...draft.attachments]\n if (!draft.submission) {\n const added = await addFiles(input.files ?? [])\n if (!added.success)\n return added\n attachments.splice(0, attachments.length, ...draft.attachments)\n }\n else {\n // 离线兜底保留失败后新增的本地文件,但不改变已发送包络或后续上传队列。\n for (const file of input.files ?? []) {\n if (attachments.length >= budget.maxAttachmentCount || file.size > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const contentType = feedbackFileContentType(file)\n if (!contentType)\n return failure('INVALID_INPUT', undefined, feedbackM('feedback_unsupportedAttachmentType'))\n const bytes = contentType === 'application/json'\n ? new TextEncoder().encode(JSON.stringify(sanitizeFeedbackData(JSON.parse(await file.text()))))\n : contentType.startsWith('text/') ? new TextEncoder().encode(sanitizeFeedbackText(await file.text())) : new Uint8Array(await file.arrayBuffer())\n if (bytes.byteLength > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const item = await attachment(file.name, contentType, bytes)\n if (!attachments.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n attachments.push(item)\n }\n }\n return createFeedbackBundle({ maxBytes: budget.maxTotalBytes, report: { ...(draft.report ?? { id: draft.submissionId, appId: config?.appId, appVersion: config?.appVersion, buildId: config?.buildId, commit: config?.commit, url: draft.evidence.filter(item => item.kind === 'environment').at(-1)?.data.url, anchor: { kind: draft.anchorKind, timestamp: draft.anchorTime }, evidenceRevision: 1 }), ...sanitizeFeedbackData({ description: input.description ?? draft.report?.description ?? '', category: input.category, contact: input.contact }) }, evidence: draft.evidence, attachments: attachments.filter(item => !input.removedAttachmentIds?.includes(item.id)), missing: [...new Set([...draft.missing, ...missing, ...(!draft.report ? ['server-evidence-not-obtained', 'feedback-not-yet-accepted'] : [])])] })\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n function close(options: { discard?: boolean } = {}): Promise<void> {\n sessionVersion++\n discardOnClose ||= options.discard === true\n closePromise ??= doClose().finally(() => {\n closePromise = undefined\n })\n return closePromise\n }\n\n async function doClose(): Promise<void> {\n closing = true\n saveController.abort()\n unsubscribeLogger?.()\n unsubscribeLogger = undefined\n stopReplay?.()\n stopReplay = undefined\n for (const cleanup of cleanups.splice(0))\n cleanup()\n if (flushTimer)\n clearInterval(flushTimer)\n if (persistTimer)\n clearTimeout(persistTimer)\n flushTimer = undefined\n persistTimer = undefined\n // 截图有既定超时;等待采集退出后再清空草稿,避免旧回调复活会话。\n await preparePromise\n await keyScreenshotPromise\n if (draft?.report)\n await flush()\n if (discardOnClose && storageKey)\n await deleteFeedbackDraft(storageKey).catch(() => undefined)\n else if (config?.persistDraft && draft && !collectionFinished)\n await saveFeedbackDraft(storageKey, draft).catch(() => undefined)\n releasePreviews()\n discardOnClose = false\n config = undefined\n preparedPage = ''\n buffer = []\n bufferBytes = 0\n draft = undefined\n lastError = undefined\n errorWindows = []\n replayChunks = []\n keyScreenshots = []\n lastKeyScreenshot = 0\n initialIds.clear()\n uploadedIds.clear()\n missing.clear()\n dropped = 0\n collectionFinished = false\n collectionSealed = false\n }\n\n return { init, prepare, captureScreenshot, submit, flush, record, getDraft: () => draft, getView, releasePreviews, annotate, addFiles, exportDraft, async saveDraft(input) {\n const session = config\n const exported = await exportDraft(input)\n if (!exported.success)\n return exported\n if (closing || !session || session !== config)\n return failure('NOT_INITIALIZED')\n return saveFeedbackFile(exported.data, `feedback-${draft?.submissionId ?? 'local'}.zip`, 'application/zip', saveController.signal)\n }, close, get budget() {\n return { ...budget }\n } }\n}\n\n/**\n * 默认浏览器采集会话。\n * @example\n * ```ts\n * import { feedbackClient } from '@h-ai/feedback/client'\n * const draft = feedbackClient.getDraft()\n * ```\n */\nexport const feedbackClient = createFeedbackClient()\n\nasync function bounded<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([promise, new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new Error('Capture timed out')), ms)\n })])\n }\n finally {\n clearTimeout(timer)\n }\n}\n\nasync function attachment(name: string, contentType: string, bytes: Uint8Array): Promise<FeedbackClientAttachment> {\n const checksum = await digestHex(bytes)\n return { id: core.id.uuid(), name: String(sanitizeFeedbackData({ text: name }).text).slice(0, 255), contentType, size: bytes.byteLength, checksum, bytes }\n}\n\nasync function digestHex(bytes: Uint8Array): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', new Uint8Array(bytes))\n return [...new Uint8Array(digest)].map(value => value.toString(16).padStart(2, '0')).join('')\n}\n\nfunction base64(bytes: Uint8Array): string {\n let value = ''\n for (let offset = 0; offset < bytes.length; offset += 32_768)\n value += String.fromCharCode(...bytes.subarray(offset, offset + 32_768))\n return btoa(value)\n}\n","/** 详情接入统一处理导出轮询、回放分页和取消,不依赖 UI 或平台 SDK。 */\nimport type { FeedbackAttachmentData, FeedbackDetail, FeedbackEvidence, FeedbackEvidenceQuery, FeedbackExportInput, FeedbackJob } from '@h-ai/api-contract/feedback'\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport { err, ok } from '@h-ai/core'\nimport { feedbackM } from '../feedback-i18n.js'\nimport { HaiFeedbackError } from '../feedback-types.js'\nimport { feedbackDataBytes, saveFeedbackFile } from './feedback-client-files.js'\n\n/**\n * 管理接口可直接传入 typedClient.feedback.reports;授权由服务端再次核验。\n * @example\n * ```ts\n * import type { FeedbackReviewActions } from '@h-ai/feedback/client'\n * function load(actions: FeedbackReviewActions) { return actions.get({ id: 'report-id' }) }\n * ```\n */\nexport interface FeedbackReviewActions {\n get: (input: { id: string }) => Promise<HaiResult<FeedbackDetail>>\n getEvidence: (input: FeedbackEvidenceQuery) => Promise<HaiResult<PaginatedResult<FeedbackEvidence>>>\n export: (input: FeedbackExportInput) => Promise<HaiResult<FeedbackJob>>\n getExport: (input: { id: string, jobId: string }) => Promise<HaiResult<FeedbackAttachmentData>>\n}\n\n/**\n * 创建可取消的详情动作;退出账号调用 close,旧轮询不能继续下载到新会话。\n * @example\n * ```ts\n * import { createFeedbackReview, type FeedbackReviewActions } from '@h-ai/feedback/client'\n * async function exportReport(actions: FeedbackReviewActions) {\n * const review = createFeedbackReview(actions)\n * const result = await review.exportReport('report-id')\n * review.close()\n * return result\n * }\n * ```\n */\nexport function createFeedbackReview(actions: FeedbackReviewActions) {\n let controller = new AbortController()\n const failed = () => err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n return {\n close() {\n controller.abort()\n controller = new AbortController()\n },\n async loadReplay(id: string): Promise<HaiResult<FeedbackEvidence[]>> {\n const signal = controller.signal\n const events: FeedbackEvidence[] = []\n try {\n for (let page = 1; page <= 100; page++) {\n const result = await actions.getEvidence({ id, kind: 'replay', page, pageSize: 100 })\n if (signal.aborted)\n return failed()\n if (!result.success)\n return result\n events.push(...result.data.items)\n if (events.length >= result.data.total || !result.data.items.length)\n return ok(events)\n }\n }\n catch {\n return failed()\n }\n return failed()\n },\n async exportReport(id: string) {\n const signal = controller.signal\n try {\n const started = await actions.export({ id })\n if (!started.success)\n return started\n for (let attempt = 0; attempt < 120; attempt++) {\n if (signal.aborted)\n return failed()\n const detail = await actions.get({ id })\n if (!detail.success)\n return detail\n if (signal.aborted)\n return failed()\n const job = detail.data.jobs.find(job => job.id === started.data.id)\n if (!job || job.status === 'failed')\n return failed()\n if (job.status === 'succeeded') {\n const file = await actions.getExport({ id, jobId: job.id })\n if (signal.aborted)\n return failed()\n return file.success ? saveFeedbackFile(feedbackDataBytes(file.data), file.data.name, file.data.contentType, signal) : file\n }\n await new Promise<void>((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', done)\n resolve()\n }\n timer = setTimeout(done, 500)\n signal.addEventListener('abort', done, { once: true })\n })\n }\n }\n catch {\n return failed()\n }\n return failed()\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/feedback-client-files.ts","../../src/client/feedback-client-image.ts","../../src/client/feedback-client-sanitize.ts","../../src/client/feedback-client-store.ts","../../src/client/feedback-client-main.ts","../../src/client/feedback-client-review.ts"],"names":["core","err","window","entry","ok","job"],"mappings":"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","file":"index.js","sourcesContent":["/** Web 下载、Tauri 保存对话框、Capacitor 原生分享的统一入口。原生插件按平台懒加载。 */\nimport type { FeedbackAttachmentData } from '@h-ai/api-contract/feedback'\nimport type { HaiResult } from '@h-ai/core'\nimport { core, err, ok } from '@h-ai/core'\nimport { feedbackM } from '../feedback-i18n.js'\nimport { HaiFeedbackError } from '../feedback-types.js'\n\n/**\n * 保存取消是正常用户操作,不应提示成功或失败。\n * @example\n * ```ts\n * import type { FeedbackSaveResult } from '@h-ai/feedback/client'\n * const cancelled: FeedbackSaveResult = { status: 'cancelled' }\n * ```\n */\nexport interface FeedbackSaveResult { status: 'saved' | 'shared' | 'cancelled' }\n\n/**\n * 由平台入口提供的保存器;Web 不导入原生插件。\n * @example\n * ```ts\n * import type { FeedbackFileSaver } from '@h-ai/feedback/client'\n * const save: FeedbackFileSaver = async () => ({ status: 'cancelled' })\n * ```\n */\nexport type FeedbackFileSaver = (bytes: Uint8Array, filename: string, contentType: string, signal?: AbortSignal) => Promise<FeedbackSaveResult>\n\nlet nativeSaver: FeedbackFileSaver | undefined\n\n/**\n * 原生入口一次性配置;生成工程自动调用。传 undefined 可解除自定义平台适配。\n * @example\n * ```ts\n * import { configureFeedbackSaving } from '@h-ai/feedback/client'\n * configureFeedbackSaving(undefined)\n * ```\n */\nexport function configureFeedbackSaving(saver: FeedbackFileSaver | undefined): void {\n nativeSaver = saver\n}\n\n/**\n * 解码受权附件或导出结果,网络与权限仍由 typed API 负责。\n * @example\n * ```ts\n * import { feedbackDataBytes } from '@h-ai/feedback/client'\n * const bytes = feedbackDataBytes({ name: 'data.txt', contentType: 'text/plain', dataBase64: 'YQ==' })\n * ```\n */\nexport function feedbackDataBytes(data: FeedbackAttachmentData): Uint8Array {\n return Uint8Array.from(atob(data.dataBase64), value => value.charCodeAt(0))\n}\n\n/**\n * 保存反馈文件。Tauri 只写用户选择的路径;Capacitor 只写临时缓存,分享结束后删除。\n * @example\n * ```ts\n * import { saveFeedbackFile } from '@h-ai/feedback/client'\n * const result = await saveFeedbackFile(new Uint8Array([1]), 'feedback.zip')\n * ```\n */\nexport async function saveFeedbackFile(bytes: Uint8Array, filename: string, contentType = 'application/zip', signal?: AbortSignal): Promise<HaiResult<FeedbackSaveResult>> {\n const name = [...filename].map(character => character.charCodeAt(0) < 32 || /[\\\\/:*?\"<>|]/.test(character) ? '_' : character).join('').slice(0, 200) || 'feedback.zip'\n try {\n if (signal?.aborted)\n return ok({ status: 'cancelled' })\n if (typeof window === 'undefined')\n throw new Error('Browser required')\n const capacitor: unknown = Reflect.get(window, 'Capacitor')\n const isNative = Reflect.get(window, '__TAURI_INTERNALS__') || (capacitor && typeof capacitor === 'object' && 'isNativePlatform' in capacitor && typeof capacitor.isNativePlatform === 'function' && capacitor.isNativePlatform())\n if (isNative) {\n if (!nativeSaver)\n throw new Error('Feedback platform saving adapter is not configured')\n return ok(await nativeSaver(bytes, name, contentType, signal))\n }\n const url = URL.createObjectURL(new Blob([new Uint8Array(bytes).buffer], { type: contentType }))\n const link = document.createElement('a')\n try {\n link.href = url\n link.download = name\n document.body.append(link)\n link.click()\n }\n finally {\n link.remove()\n setTimeout(() => URL.revokeObjectURL(url), 60000)\n }\n return ok({ status: 'saved' })\n }\n catch (cause) {\n const error = core.error.toPublic({ ...HaiFeedbackError.OPERATION_FAILED, message: feedbackM('feedback_operationFailed') })\n core.logger.error('Feedback file save failed', { traceId: error.traceId, error: cause })\n return err(error)\n }\n}\n","/**\n * 截图与标注都在浏览器侧执行,不把原始 DOM 上传到受理服务。\n * 标注默认使用原图像素;UI 可直接传 coordinateSpace: 'ratio',由 SDK 换算实际图片尺寸。\n * @example\n * ```ts\n * import type { FeedbackImageAnnotation } from '@h-ai/feedback/client'\n * const mask: FeedbackImageAnnotation = { x: 0, y: 0, width: 100, height: 40, mode: 'mask' }\n * ```\n */\nexport interface FeedbackImageAnnotation {\n /** ratio 由 SDK 按解码后的原图换算,宿主无需处理缩放或 JPEG 方向。 */\n coordinateSpace?: 'pixel' | 'ratio'\n x: number\n y: number\n width: number\n height: number\n mode: 'mask' | 'outline'\n}\n\nconst PRIVATE_SELECTOR = 'input[type=\"password\"],[data-feedback-private],.rr-block,.rr-mask'\nconst CONTROL_SELECTOR = 'input,textarea,select,[contenteditable]:not([contenteditable=\"false\"])'\n\n/**\n * 捕获当前可见页面;反馈 UI 必须由调用方在本操作完成之后打开。\n * @param signal - 取消等待或克隆;底层渲染不可中断时由调用方保留实际任务的单飞约束。\n * @example 模块内部上下文\n * ```ts\n * const bytes = await captureFeedbackScreenshot()\n * const length = bytes.byteLength\n * ```\n */\nexport async function captureFeedbackScreenshot(signal?: AbortSignal): Promise<Uint8Array> {\n signal?.throwIfAborted()\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT)\n let nodes = 0\n while (walker.nextNode()) {\n if (++nodes > 10000)\n throw new RangeError('Screenshot document budget exceeded')\n }\n // 网络字体未就绪时最多等待半秒;采集总超时仍由客户端统一控制。\n if (document.fonts) {\n let timeout: ReturnType<typeof setTimeout> | undefined\n try {\n await Promise.race([document.fonts.ready, new Promise<void>(resolve => timeout = setTimeout(resolve, 500))])\n }\n finally {\n clearTimeout(timeout)\n }\n }\n const { default: html2canvas } = await import('html2canvas')\n signal?.throwIfAborted()\n const canvas = await html2canvas(document.body, {\n width: window.innerWidth,\n height: window.innerHeight,\n scale: Math.min(1, 1920 / window.innerWidth, 1200 / window.innerHeight),\n // 原生 SVG foreignObject 保留 CSS mask 图标与字体基线,避免 CanvasRenderer 裁切文本。\n foreignObjectRendering: true,\n x: window.scrollX,\n y: window.scrollY,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n useCORS: false,\n allowTaint: false,\n logging: false,\n imageTimeout: 1000,\n ignoreElements: element => element.matches('[data-feedback-ignore],iframe,video'),\n onclone: (clone) => {\n signal?.throwIfAborted()\n // html2canvas 仍会预解析根背景;现代颜色先转为浏览器实际像素色,原页面不变。\n const colorCanvas = clone.createElement('canvas')\n colorCanvas.width = 1\n colorCanvas.height = 1\n const paint = colorCanvas.getContext('2d', { willReadFrequently: true })\n const colors = new Map<string, string>()\n if (paint && clone.defaultView) {\n for (const element of clone.querySelectorAll<HTMLElement>('*')) {\n const computed = clone.defaultView.getComputedStyle(element)\n for (const property of ['color', 'background-color', 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color', 'outline-color', 'text-decoration-color', '-webkit-text-stroke-color']) {\n const raw = computed.getPropertyValue(property)\n if (!/oklch|oklab|color\\(|lab\\(|lch\\(/i.test(raw))\n continue\n let normalized = colors.get(raw)\n if (!normalized) {\n paint.clearRect(0, 0, 1, 1)\n paint.fillStyle = raw\n paint.fillRect(0, 0, 1, 1)\n const pixel = paint.getImageData(0, 0, 1, 1).data\n normalized = `rgba(${pixel[0]},${pixel[1]},${pixel[2]},${pixel[3]! / 255})`\n colors.set(raw, normalized)\n }\n element.style.setProperty(property, normalized, 'important')\n }\n }\n }\n for (const element of clone.querySelectorAll<HTMLElement>(`${PRIVATE_SELECTOR},${CONTROL_SELECTOR}`)) {\n if (!clone.documentElement.contains(element))\n continue\n const bounds = element.getBoundingClientRect()\n const replacement = clone.createElement('div')\n // 普通输入控件保留边框、底色和布局,只替换内容;显式私密区域继续不可逆遮挡。\n const computed = clone.defaultView?.getComputedStyle(element)\n if (computed) {\n for (const property of Array.from(computed))\n replacement.style.setProperty(property, computed.getPropertyValue(property), 'important')\n }\n replacement.style.setProperty('width', `${bounds.width}px`, 'important')\n replacement.style.setProperty('height', `${bounds.height}px`, 'important')\n replacement.style.setProperty('box-sizing', 'border-box', 'important')\n replacement.style.setProperty('overflow', 'hidden', 'important')\n if (element.matches(PRIVATE_SELECTOR)) {\n replacement.style.setProperty('background', '#111', 'important')\n replacement.style.setProperty('color', 'transparent', 'important')\n }\n else {\n const control = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n const value = 'value' in control ? control.value : element.textContent\n replacement.textContent = value ? '••••' : element.getAttribute('placeholder') ?? ''\n }\n replacement.setAttribute('aria-hidden', 'true')\n element.replaceWith(replacement)\n }\n },\n })\n try {\n signal?.throwIfAborted()\n const bytes = await canvasBytes(canvas)\n signal?.throwIfAborted()\n return bytes\n }\n finally {\n canvas.width = 0\n canvas.height = 0\n }\n}\n\n/**\n * 将遮挡实际烧录进图片,导出时不携带可恢复的原图。\n * @example 模块内部上下文\n * ```ts\n * const input = await captureFeedbackScreenshot()\n * const output = await annotateFeedbackImage(input, { x: 10, y: 10, width: 40, height: 20, mode: 'mask' })\n * ```\n */\nexport async function annotateFeedbackImage(bytes: Uint8Array, annotation: FeedbackImageAnnotation): Promise<Uint8Array> {\n if (![annotation.x, annotation.y, annotation.width, annotation.height].every(Number.isFinite) || annotation.width <= 0 || annotation.height <= 0)\n throw new Error('Invalid annotation rectangle')\n const image = new Image()\n const imageUrl = URL.createObjectURL(new Blob([new Uint8Array(bytes)], { type: 'image/png' }))\n const canvas = document.createElement('canvas')\n try {\n image.src = imageUrl\n await image.decode()\n if (annotation.coordinateSpace === 'ratio') {\n if ([annotation.x, annotation.y, annotation.width, annotation.height].some(value => value < 0 || value > 1))\n throw new Error('Invalid annotation ratio')\n annotation = { ...annotation, x: annotation.x * image.naturalWidth, y: annotation.y * image.naturalHeight, width: annotation.width * image.naturalWidth, height: annotation.height * image.naturalHeight }\n }\n canvas.width = image.naturalWidth\n canvas.height = image.naturalHeight\n const context = canvas.getContext('2d')\n if (!context)\n throw new Error('Canvas is unavailable')\n context.drawImage(image, 0, 0)\n if (annotation.mode === 'mask') {\n context.fillStyle = '#111'\n // 向外覆盖完整像素,避免小数选区的抗锯齿透出敏感内容。\n const left = Math.floor(annotation.x)\n const top = Math.floor(annotation.y)\n context.fillRect(left, top, Math.ceil(annotation.x + annotation.width) - left, Math.ceil(annotation.y + annotation.height) - top)\n }\n else {\n context.strokeStyle = '#e11d48'\n context.lineWidth = 3\n context.strokeRect(annotation.x, annotation.y, annotation.width, annotation.height)\n }\n return await canvasBytes(canvas)\n }\n finally {\n URL.revokeObjectURL(imageUrl)\n canvas.width = 0\n canvas.height = 0\n }\n}\n\nasync function canvasBytes(canvas: HTMLCanvasElement): Promise<Uint8Array> {\n const blob = await new Promise<Blob>((resolve, reject) => canvas.toBlob(value => value ? resolve(value) : reject(new Error('Screenshot encoding failed')), 'image/png'))\n return new Uint8Array(await blob.arrayBuffer())\n}\n","import { core } from '@h-ai/core'\nimport { redactFeedbackText } from '../feedback-sanitize-text.js'\n\nconst CREDENTIAL_NAME = /authorization|password|passcode|secret|token|session|csrf|credential|api.?key|private.?key/i\n\n/**\n * 浏览器自由文本全文脱敏;附件总字节数由调用方限制,结构化字段自行裁剪。\n * @example 模块内部上下文\n * ```ts\n * const safeText = sanitizeFeedbackText('Request failed token=example-only')\n * void safeText\n * ```\n */\nexport function sanitizeFeedbackText(value: string): string {\n return redactFeedbackText(value).replace(/\\bhttps?:\\/\\/[^\\s<>\"']+/gi, url => core.sanitize.sanitizeUrl(url))\n}\n\n/**\n * 自由文本也在进入缓冲前脱敏;结构化字段规则复用 core。\n * @example 模块内部上下文\n * ```ts\n * const safe = sanitizeFeedbackData({ token: 'example-only', message: 'Request failed' })\n * ```\n */\nexport function sanitizeFeedbackData(value: unknown): Record<string, unknown> {\n const seen = new WeakSet<object>()\n function visit(input: unknown, depth: number): unknown {\n if (depth > 8)\n return '[TRUNCATED]'\n if (typeof input === 'string')\n return sanitizeFeedbackText(input).slice(0, 8192)\n if (input instanceof Error)\n return visit({ name: input.name, message: input.message, stack: input.stack }, depth + 1)\n if (!input || typeof input !== 'object')\n return input === undefined || typeof input === 'function' || typeof input === 'symbol' ? null : typeof input === 'bigint' ? String(input) : input\n if (seen.has(input))\n return '[CIRCULAR]'\n seen.add(input)\n if (Array.isArray(input))\n return input.slice(0, 200).map(item => visit(item, depth + 1))\n const output: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(input).slice(0, 100)) {\n if (['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n output[key] = CREDENTIAL_NAME.test(key) ? '[REDACTED]' : visit(item, depth + 1)\n }\n return output\n }\n const safe = core.sanitize.sanitizeSensitiveFields(visit(value, 0))\n return safe && typeof safe === 'object' && !Array.isArray(safe) ? safe as Record<string, unknown> : { value: safe }\n}\n\n/**\n * 保留 rrweb 的快照树结构;禁用脚本/导航及外部资源,避免离线查看访问生产网络。\n * @example 模块内部上下文\n * ```ts\n * const safe = sanitizeFeedbackReplay({ type: 2, data: { node: { tagName: 'div', attributes: {} } } })\n * ```\n */\nexport function sanitizeFeedbackReplay(value: unknown): Record<string, unknown> {\n function visit(input: unknown, depth: number): unknown {\n if (depth > 64)\n throw new Error('Replay snapshot exceeds depth limit')\n if (typeof input === 'string')\n return sanitizeFeedbackText(input)\n if (input === undefined)\n return null\n if (!input || typeof input !== 'object')\n return input\n if (Array.isArray(input))\n return input.map(item => visit(item, depth + 1))\n const output: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(input)) {\n if (['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n if (key === 'attributes' && item && typeof item === 'object') {\n const attributes: Record<string, unknown> = {}\n for (const [attribute, content] of Object.entries(item)) {\n if (/^on|^(?:srcdoc|action|formaction|href|srcset|rr_src)$/i.test(attribute) || CREDENTIAL_NAME.test(attribute))\n continue\n if (attribute === 'src' && typeof content === 'string' && !/^data:image\\/(?:png|jpeg|webp|gif);base64,/i.test(content)) {\n attributes['data-feedback-missing-resource'] = true\n continue\n }\n if ((attribute === 'style' || attribute === '_cssText') && typeof content === 'string') {\n attributes[attribute] = sanitizeFeedbackText(content).replace(/(?:url|@import)\\s*\\([^)]*\\)|@import\\s+[\"'][^\"']+[\"']/gi, '')\n attributes['data-feedback-missing-resource'] = true\n }\n else {\n attributes[attribute] = visit(content, depth + 1)\n }\n }\n output[key] = attributes\n }\n else if (key === 'textContent' && typeof item === 'string') {\n output[key] = sanitizeFeedbackText(item).replace(/(?:url|@import)\\s*\\([^)]*\\)|@import\\s+[\"'][^\"']+[\"']/gi, '')\n }\n else {\n output[key] = CREDENTIAL_NAME.test(key) ? '[REDACTED]' : visit(item, depth + 1)\n }\n }\n return output\n }\n return visit(value, 0) as Record<string, unknown>\n}\n\n/**\n * 只保留显式白名单中的普通业务 Cookie,永远拒绝凭证类名称。\n * @example 模块内部上下文\n * ```ts\n * const cookies = collectFeedbackCookies('theme=dark; access_token=example-only', ['theme'])\n * ```\n */\nexport function collectFeedbackCookies(cookie: string, allowlist: readonly string[]): Record<string, string> {\n const allowed = new Set(allowlist.filter(name => !CREDENTIAL_NAME.test(name)))\n const output: Record<string, string> = {}\n for (const pair of cookie.split(';')) {\n const separator = pair.indexOf('=')\n if (separator < 0)\n continue\n const name = pair.slice(0, separator).trim()\n if (!allowed.has(name))\n continue\n output[name] = redactFeedbackText(pair.slice(separator + 1).trim().slice(0, 256))\n }\n return output\n}\n\n/**\n * 默认 URL 不收集查询参数和 hash,避免未知业务隐私进入材料。\n * @example 模块内部上下文\n * ```ts\n * const page = feedbackPageUrl('https://example.test/orders?filter=mine')\n * ```\n */\nexport function feedbackPageUrl(raw: string): string {\n try {\n const url = new URL(raw)\n return `${url.origin}${url.pathname}`\n }\n catch {\n return '[INVALID_URL]'\n }\n}\n","import type { FeedbackEvidenceInput } from '@h-ai/api-contract/feedback'\nimport type { FeedbackDraft } from './feedback-client-types.js'\n\nconst STORE = 'drafts'\n\n/** 每个应用只保存一份有期限的脱敏现场,关闭窗口不自动丢弃待传材料。 */\nasync function withStore<T>(callback: (store: IDBObjectStore) => IDBRequest<T>): Promise<T> {\n const database = await new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open('hai-feedback-v1', 1)\n request.onupgradeneeded = () => request.result.createObjectStore(STORE)\n request.onerror = () => reject(request.error)\n request.onsuccess = () => resolve(request.result)\n })\n try {\n return await new Promise<T>((resolve, reject) => {\n const transaction = database.transaction(STORE, 'readwrite')\n const request = callback(transaction.objectStore(STORE))\n transaction.oncomplete = () => resolve(request.result)\n transaction.onerror = () => reject(transaction.error)\n transaction.onabort = () => reject(transaction.error)\n })\n }\n finally {\n database.close()\n }\n}\n\n/**\n * 保存已脱敏且有期限的待传现场。\n * @example 模块内部上下文\n * ```ts\n * async function persist(draft: FeedbackDraft) { await saveFeedbackDraft('orders:user-1', draft) }\n * ```\n */\nexport async function saveFeedbackDraft(appId: string, draft: FeedbackDraft): Promise<void> {\n await withStore(store => store.put(draft, appId))\n}\n\n/**\n * 读取同一身份范围的本机现场,过期数据立即清理。\n * @example 模块内部上下文\n * ```ts\n * const draft = await restoreFeedbackDraft('orders:user-1')\n * ```\n */\nexport async function restoreFeedbackDraft(appId: string): Promise<FeedbackDraft | undefined> {\n const value: unknown = await withStore(store => store.get(appId))\n if (!value || typeof value !== 'object' || !('expiresAt' in value) || typeof value.expiresAt !== 'number' || value.expiresAt <= Date.now()) {\n await withStore(store => store.delete(appId))\n return undefined\n }\n // 本机存储仍视为不可信,完整 schema 由调用方恢复前再次验证。\n return value as FeedbackDraft\n}\n\n/**\n * 持久化确认成功后删除草稿及旧检查点。\n * @example 模块内部上下文\n * ```ts\n * await deleteFeedbackDraft('orders:user-1')\n * ```\n */\nexport async function deleteFeedbackDraft(appId: string): Promise<void> {\n await withStore((store) => {\n store.delete(`${appId}:checkpoint`)\n return store.delete(appId)\n })\n}\n\n/**\n * 授权持久化时保存崩溃前的脱敏记录。\n * @example 模块内部上下文\n * ```ts\n * await saveFeedbackCheckpoint('orders:user-1', [])\n * ```\n */\nexport async function saveFeedbackCheckpoint(key: string, evidence: readonly FeedbackEvidenceInput[]): Promise<void> {\n await withStore(store => store.put({ evidence, expiresAt: Date.now() + 300_000 }, `${key}:checkpoint`))\n}\n\n/**\n * 恢复检查点,调用方仍须验证结构和期限。\n * @example 模块内部上下文\n * ```ts\n * const checkpoint = await restoreFeedbackCheckpoint('orders:user-1')\n * ```\n */\nexport async function restoreFeedbackCheckpoint(key: string): Promise<unknown> {\n return withStore(store => store.get(`${key}:checkpoint`))\n}\n","import type { FeedbackEvidenceInput, FeedbackReport } from '@h-ai/api-contract/feedback'\nimport type { HaiResult } from '@h-ai/core'\nimport type { FeedbackBrowserClient, FeedbackClientAttachment, FeedbackClientConfig, FeedbackClientSubmitInput, FeedbackDraft } from './feedback-client-types.js'\nimport { FeedbackBudgetSchema, FeedbackEvidenceInputSchema, FeedbackReportSchema, FeedbackSubmitInputSchema, resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\nimport { core, err, ok } from '@h-ai/core'\nimport { feedbackM } from '../feedback-i18n.js'\nimport { HaiFeedbackError } from '../feedback-types.js'\nimport { saveFeedbackFile } from './feedback-client-files.js'\nimport { annotateFeedbackImage, captureFeedbackScreenshot } from './feedback-client-image.js'\nimport { collectFeedbackCookies, feedbackPageUrl, sanitizeFeedbackData, sanitizeFeedbackReplay, sanitizeFeedbackText } from './feedback-client-sanitize.js'\nimport { deleteFeedbackDraft, restoreFeedbackCheckpoint, restoreFeedbackDraft, saveFeedbackCheckpoint, saveFeedbackDraft } from './feedback-client-store.js'\n\n/** 系统文件关联可能不提供 MIME;只对空值和通用二进制类型按受支持扩展名补齐。 */\nfunction feedbackFileContentType(file: File): string | undefined {\n const type = file.type.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n const extensions = new Map([\n ['png', 'image/png'],\n ['jpg', 'image/jpeg'],\n ['jpeg', 'image/jpeg'],\n ['webp', 'image/webp'],\n ['webm', 'video/webm'],\n ['mp4', 'video/mp4'],\n ['txt', 'text/plain'],\n ['log', 'text/plain'],\n ['json', 'application/json'],\n ['pdf', 'application/pdf'],\n ['zip', 'application/zip'],\n ['gz', 'application/gzip'],\n ['tgz', 'application/gzip'],\n ])\n if (!type || type === 'application/octet-stream')\n return extensions.get(file.name.split('.').at(-1)?.toLowerCase() ?? '')\n const aliases = new Map([\n ['image/x-png', 'image/png'],\n ['image/jpg', 'image/jpeg'],\n ['image/pjpeg', 'image/jpeg'],\n ['text/json', 'application/json'],\n ['text/x-log', 'text/plain'],\n ['application/x-pdf', 'application/pdf'],\n ['application/x-zip-compressed', 'application/zip'],\n ['application/x-gzip', 'application/gzip'],\n ])\n const normalized = aliases.get(type) ?? type\n return [...extensions.values()].includes(normalized) ? normalized : undefined\n}\n\n/**\n * 创建独立浏览器采集会话;默认不持久化、不录制页面回放,不采集请求正文。\n * @example\n * ```ts\n * import { createFeedbackClient } from '@h-ai/feedback/client'\n * const client = createFeedbackClient()\n * const draft = client.getDraft()\n * await client.close()\n * ```\n */\nexport function createFeedbackClient(): FeedbackBrowserClient {\n let config: FeedbackClientConfig | undefined\n let draft: FeedbackDraft | undefined\n let sessionVersion = 0\n let policyVerified = false\n let preparedPage = ''\n let budget = resolveFeedbackBudget()\n const previews = new Map<string, { checksum: string, url: string }>()\n let discardOnClose = false\n let saveController = new AbortController()\n\n function releasePreviews() {\n for (const preview of previews.values()) URL.revokeObjectURL(preview.url)\n previews.clear()\n }\n\n function getView() {\n const files = draft?.attachments ?? []\n for (const [id, preview] of previews) {\n if (!files.some(file => file.id === id && file.checksum === preview.checksum)) {\n URL.revokeObjectURL(preview.url)\n previews.delete(id)\n }\n }\n return { attachments: files.map((file) => {\n let preview = previews.get(file.id)\n if (!preview) {\n preview = { checksum: file.checksum, url: URL.createObjectURL(new Blob([new Uint8Array(file.bytes).buffer], { type: file.contentType })) }\n previews.set(file.id, preview)\n }\n return { id: file.id, name: file.name, size: file.size, mimeType: file.contentType, url: preview.url }\n }), evidence: draft?.evidence ?? [], missing: draft?.missing ?? [], budget: { ...budget } }\n }\n let initializing = false\n let sequence = 0\n let buffer: FeedbackEvidenceInput[] = []\n let bufferBytes = 0\n let dropped = 0\n let lastError: FeedbackEvidenceInput | undefined\n let errorWindows: Array<{ anchor: FeedbackEvidenceInput, evidence: FeedbackEvidenceInput[], after: number, deadline: number, bytes: number }> = []\n let afterCount = 0\n let deadline = 0\n let initialIds = new Set<string>()\n const uploadedIds = new Set<string>()\n let flushPromise: Promise<HaiResult<void>> | undefined\n let preparePromise: Promise<HaiResult<FeedbackDraft>> | undefined\n let persistTimer: ReturnType<typeof setTimeout> | undefined\n let flushTimer: ReturnType<typeof setInterval> | undefined\n let stopReplay: (() => void) | undefined\n let screenshotCaptures = 0\n let captureTask: { promise: Promise<Uint8Array>, controller: AbortController, config: FeedbackClientConfig } | undefined\n let replayRequested = false\n let unsubscribeLogger: (() => void) | undefined\n let source = ''\n let keyScreenshots: Array<{ attachment: FeedbackClientAttachment, timestamp: number }> = []\n let lastKeyScreenshot = 0\n let keyScreenshotPromise: Promise<void> | undefined\n let closing = false\n let closePromise: Promise<void> | undefined\n let collectionFinished = false\n let collectionSealed = false\n let draftBytes = 0\n let storageKey = ''\n const cleanups: Array<() => void> = []\n const missing = new Set<string>()\n let replayChunks: FeedbackEvidenceInput[][] = []\n\n function failure(code: keyof typeof HaiFeedbackError = 'OPERATION_FAILED', cause?: unknown, message?: string) {\n const key = code === 'NOT_INITIALIZED' ? 'feedback_notInitialized' : code === 'LIMIT_EXCEEDED' ? 'feedback_limitExceeded' : code === 'INVALID_INPUT' ? 'feedback_invalidInput' : 'feedback_operationFailed'\n const traceId = core.context.get().traceId ?? core.context.get().requestId ?? core.id.uuid()\n const error = { ...HaiFeedbackError[code], traceId, message: message ?? feedbackM(key), cause }\n if (!(closing && code === 'NOT_INITIALIZED'))\n core.logger[cause === undefined ? 'warn' : 'error']('Feedback client operation failed', { module: 'feedback', traceId, error })\n return err({ ...error, message: core.error.formatMessage(error) })\n }\n\n function limits() {\n return { events: Math.min(config?.maxEvents ?? 1000, budget.maxEvidenceCount), bytes: Math.min(config?.maxBytes ?? 2 * 1024 * 1024, budget.maxEvidenceBytes), age: config?.maxAgeMs ?? 300_000, before: config?.beforeCount ?? 100, after: config?.afterCount ?? 100 }\n }\n\n function schedulePersist() {\n if (!config?.persistDraft || persistTimer)\n return\n persistTimer = setTimeout(() => {\n persistTimer = undefined\n if (config && draft && !collectionFinished)\n void saveFeedbackDraft(storageKey, draft).catch(() => missing.add('browser-persistence-unavailable'))\n else if (config)\n void saveFeedbackCheckpoint(storageKey, buffer).catch(() => missing.add('browser-persistence-unavailable'))\n }, 200)\n }\n\n function record(event: { kind: FeedbackEvidenceInput['kind'], data: Record<string, unknown>, requestId?: string, errorId?: string }) {\n if (!config || closing)\n return\n const entry = FeedbackEvidenceInputSchema.safeParse({\n id: core.id.uuid(),\n source,\n sequence: ++sequence,\n kind: event.kind,\n timestamp: Date.now(),\n requestId: event.requestId,\n errorId: event.kind === 'error' || (event.kind === 'request' && event.data.success === false) ? event.errorId ?? core.id.uuid() : event.errorId,\n data: sanitizeFeedbackData(event.data),\n })\n if (!entry.success)\n return\n const item = entry.data\n const size = new TextEncoder().encode(JSON.stringify(item)).byteLength\n const bounds = limits()\n if (size > Math.min(bounds.bytes, 64 * 1024)) {\n dropped++\n return\n }\n buffer.push(item)\n bufferBytes += size\n while (buffer.length > bounds.events || bufferBytes > bounds.bytes || (buffer[0]?.timestamp ?? 0) < Date.now() - bounds.age) {\n const removed = buffer.shift()\n if (removed)\n bufferBytes -= new TextEncoder().encode(JSON.stringify(removed)).byteLength\n dropped++\n }\n const logEntry = item.kind === 'log' || item.kind === 'error'\n if (logEntry) {\n for (const window of errorWindows) {\n if (item.timestamp <= window.deadline && window.after < bounds.after) {\n window.evidence.push(item)\n window.after++\n window.bytes += size\n }\n }\n }\n if (item.kind === 'error' || (item.kind === 'request' && item.data.success === false)) {\n lastError = item\n const before = buffer.filter(entry => (entry.kind === 'log' || entry.kind === 'error') && entry.id !== item.id)\n const evidence = [...before.slice(Math.max(0, before.length - bounds.before)), item]\n errorWindows.push({ anchor: item, evidence, after: 0, deadline: item.timestamp + (config.afterTimeoutMs ?? 30_000), bytes: new TextEncoder().encode(JSON.stringify(evidence)).byteLength })\n void captureKeyScreenshot()\n }\n errorWindows = errorWindows.filter(window => window.anchor.timestamp >= Date.now() - bounds.age)\n while (errorWindows.length > 10 || errorWindows.reduce((total, window) => total + window.evidence.length, 0) > bounds.events || errorWindows.reduce((total, window) => total + window.bytes, 0) > bounds.bytes) {\n errorWindows.shift()\n missing.add('browser-error-windows-truncated')\n }\n schedulePersist()\n appendToDraft(item, size)\n }\n\n function appendToDraft(item: FeedbackEvidenceInput, size: number, snapshot = false) {\n const bounds = limits()\n if (draft && !collectionFinished && !collectionSealed && (snapshot || (Date.now() <= deadline && afterCount < bounds.after) || item.kind === 'environment') && draft.evidence.length < bounds.events && draftBytes + size <= bounds.bytes) {\n draft.evidence.push(item)\n draftBytes += size\n if (item.kind === 'log' || item.kind === 'error')\n afterCount++\n schedulePersist()\n }\n }\n\n function listen<K extends keyof WindowEventMap>(name: K, callback: (event: WindowEventMap[K]) => void) {\n window.addEventListener(name, callback)\n cleanups.push(() => window.removeEventListener(name, callback))\n }\n\n async function init(input: FeedbackClientConfig): Promise<HaiResult<void>> {\n if (initializing)\n return err(HaiFeedbackError.INIT_IN_PROGRESS, feedbackM('feedback_initInProgress'))\n initializing = true\n try {\n if (config || closePromise)\n await close()\n if (typeof window === 'undefined' || !input.appId || !input.actions || ['submit', 'appendEvidence', 'completeCollection', 'upload'].some(key => typeof input.actions[key as keyof typeof input.actions] !== 'function'))\n return failure('INVALID_INPUT')\n const numeric = [input.maxEvents, input.maxBytes, input.maxAgeMs, input.beforeCount, input.afterCount, input.afterTimeoutMs, input.screenshotTimeoutMs, input.maxKeyScreenshots, input.keyScreenshotThrottleMs]\n if (numeric.some(value => value !== undefined && (!Number.isSafeInteger(value) || value < 0)) || (input.persistDraft && !input.persistenceKey))\n return failure('INVALID_INPUT')\n if (input.replayStart !== undefined && !['init', 'prepare'].includes(input.replayStart))\n return failure('INVALID_INPUT')\n if (!FeedbackSubmitInputSchema.pick({ appId: true, appVersion: true, buildId: true, commit: true }).safeParse({ appId: input.appId, appVersion: input.appVersion, buildId: input.buildId, commit: input.commit }).success)\n return failure('INVALID_INPUT')\n const initVersion = sessionVersion\n const policy = input.actions.policy ? await input.actions.policy().catch(() => failure('OPERATION_FAILED')) : ok(input.budget ?? resolveFeedbackBudget())\n if (initVersion !== sessionVersion)\n return failure('NOT_INITIALIZED')\n policyVerified = policy.success\n budget = FeedbackBudgetSchema.parse(policy.success ? policy.data : input.budget ?? resolveFeedbackBudget())\n if (!policy.success)\n missing.add('server-policy-unavailable')\n config = input\n saveController = new AbortController()\n closing = false\n source = `browser:${core.id.uuid()}`\n storageKey = `${input.appId}:${input.persistenceKey ?? ''}`\n if (input.persistDraft) {\n try {\n const restored = await restoreFeedbackDraft(storageKey)\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n if (restored && Array.isArray(restored.evidence) && restored.evidence.every(item => FeedbackEvidenceInputSchema.safeParse(item).success)\n && Array.isArray(restored.attachments) && restored.attachments.every(item => item.bytes instanceof Uint8Array)\n && (!restored.report || FeedbackReportSchema.safeParse(restored.report).success)) {\n draft = restored\n missing.add('browser-session-interrupted')\n deadline = Date.now()\n }\n else {\n const checkpoint = await restoreFeedbackCheckpoint(storageKey)\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n if (checkpoint && typeof checkpoint === 'object' && 'evidence' in checkpoint && Array.isArray(checkpoint.evidence) && 'expiresAt' in checkpoint && typeof checkpoint.expiresAt === 'number' && checkpoint.expiresAt > Date.now()) {\n const parsed = checkpoint.evidence.map(item => FeedbackEvidenceInputSchema.safeParse(item))\n if (parsed.every(item => item.success)) {\n buffer = parsed.filter(item => item.success).map(item => item.data)\n bufferBytes = new TextEncoder().encode(JSON.stringify(buffer)).byteLength\n sequence = Math.max(0, ...buffer.map(item => item.sequence))\n lastError = buffer.filter(item => item.kind === 'error' || (item.kind === 'request' && item.data.success === false)).at(-1)\n missing.add('browser-session-interrupted')\n missing.add('previous-page-screenshot-unavailable')\n }\n }\n }\n }\n catch {\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n missing.add('browser-persistence-unavailable')\n }\n }\n unsubscribeLogger = core.logger.observe((entry) => {\n if (entry.context.module === 'feedback' || entry.context.feedback === true)\n return\n record({ kind: ['error', 'fatal'].includes(entry.level) ? 'error' : 'log', requestId: typeof entry.context.requestId === 'string' ? entry.context.requestId : typeof entry.context.traceId === 'string' ? entry.context.traceId : undefined, data: { level: entry.level, message: entry.message, context: entry.context } })\n })\n listen('error', event => record({ kind: 'error', data: { message: event.message, stack: event.error instanceof Error ? event.error.stack : undefined, filename: feedbackPageUrl(event.filename || location.href), line: event.lineno, column: event.colno } }))\n listen('unhandledrejection', event => record({ kind: 'error', data: { reason: event.reason } }))\n const click = (event: MouseEvent) => {\n if (!(event.target instanceof Element) || event.target.closest('[data-feedback-ignore]'))\n return\n const target = event.target.closest('[data-feedback-action],button,a')\n if (target && !target.closest('[data-feedback-private]')) {\n record({ kind: 'interaction', data: { action: target.getAttribute('data-feedback-action') ?? target.tagName.toLowerCase(), route: location.pathname } })\n if (target.hasAttribute('data-feedback-action'))\n void captureKeyScreenshot()\n }\n }\n document.addEventListener('click', click, true)\n cleanups.push(() => document.removeEventListener('click', click, true))\n if (input.captureConsole) {\n for (const level of ['debug', 'info', 'warn', 'error'] as const) {\n const original = globalThis.console[level]\n const wrapper: typeof original = (...args) => {\n record({ kind: level === 'error' ? 'error' : 'log', data: { channel: 'console', level, arguments: args } })\n original.apply(globalThis.console, args)\n }\n globalThis.console[level] = wrapper\n cleanups.push(() => {\n if (globalThis.console[level] === wrapper)\n globalThis.console[level] = original\n })\n }\n }\n listen('pagehide', () => {\n deadline = Date.now()\n if (input.persistDraft && draft)\n void saveFeedbackDraft(storageKey, draft).catch(() => missing.add('browser-persistence-unavailable'))\n else if (input.persistDraft)\n void saveFeedbackCheckpoint(storageKey, buffer).catch(() => missing.add('browser-persistence-unavailable'))\n void flush()\n })\n replayRequested = input.replayStart === 'init'\n if (input.replay && replayRequested)\n await startReplay(input)\n if (closing || config !== input)\n return failure('NOT_INITIALIZED')\n flushTimer = setInterval(() => {\n if (draft && Date.now() > deadline && input.replayStart !== 'init') {\n replayRequested = false\n stopReplay?.()\n stopReplay = undefined\n }\n if (draft?.report)\n void flush()\n }, 1000)\n return ok(undefined)\n }\n catch (cause) {\n await close()\n return failure('OPERATION_FAILED', cause)\n }\n finally {\n initializing = false\n }\n }\n\n async function startReplay(activeConfig: FeedbackClientConfig) {\n try {\n const { record: start } = await import('@rrweb/record')\n if (closing || config !== activeConfig || stopReplay)\n return\n if (screenshotCaptures) {\n missing.add('replay-deferred-by-capture')\n return\n }\n let firstEvent = true\n stopReplay = start({\n maskAllInputs: true,\n maskTextSelector: '[data-feedback-private],.rr-mask',\n blockSelector: '[data-feedback-ignore],[data-feedback-private],.rr-block,iframe,canvas,video',\n // rrweb 内联跨域图像会修改原 img 的 crossOrigin,可能破坏带凭据的头像等资源。\n inlineImages: false,\n inlineStylesheet: true,\n collectFonts: false,\n checkoutEveryNms: 30_000,\n emit: (event, isCheckout) => {\n if (firstEvent || isCheckout || replayChunks.length === 0)\n replayChunks.push([])\n firstEvent = false\n let payload: Record<string, unknown>\n try {\n payload = sanitizeFeedbackReplay(event)\n }\n catch {\n missing.add('replay-snapshot-truncated')\n return\n }\n const safe = FeedbackEvidenceInputSchema.safeParse({ id: core.id.uuid(), source, sequence: ++sequence, kind: 'replay', timestamp: Date.now(), data: { event: payload } })\n if (!safe.success)\n return\n replayChunks.at(-1)?.push(safe.data)\n // 按需启动的当前页面快照属于本次准备材料,即使错误的后采窗口已结束也保留。\n appendToDraft(safe.data, new TextEncoder().encode(JSON.stringify(safe.data)).byteLength, event.type === 2 || event.type === 4)\n while (replayChunks.length > 2)\n replayChunks.shift()\n const count = replayChunks.reduce((total, chunk) => total + chunk.length, 0)\n const bytes = new TextEncoder().encode(JSON.stringify(replayChunks)).byteLength\n if (count > limits().events || bytes > limits().bytes) {\n replayChunks = []\n missing.add('replay-capacity-exceeded')\n }\n },\n }) ?? undefined\n }\n catch {\n if (!closing && config === activeConfig)\n missing.add('replay-recorder-unavailable')\n }\n }\n\n function captureKeyScreenshot(): Promise<void> {\n if (!config || config.screenshot === false || config.keyScreenshots !== true || config.maxKeyScreenshots === 0 || keyScreenshotPromise || captureTask || Date.now() - lastKeyScreenshot < (config.keyScreenshotThrottleMs ?? 10_000))\n return keyScreenshotPromise ?? Promise.resolve()\n const activeConfig = config\n lastKeyScreenshot = Date.now()\n keyScreenshotPromise = (async () => {\n try {\n const bytes = await takeScreenshot(activeConfig)\n if (closing || config !== activeConfig)\n return\n if (bytes.byteLength > budget.maxAttachmentBytes) {\n missing.add('key-screenshot-size-limit-exceeded')\n return\n }\n const image = await attachment(`operation-${lastKeyScreenshot}.png`, 'image/png', bytes)\n if (closing || config !== activeConfig)\n return\n keyScreenshots.push({ attachment: image, timestamp: lastKeyScreenshot })\n keyScreenshots = keyScreenshots.filter(item => item.timestamp >= Date.now() - limits().age).slice(-Math.min(activeConfig.maxKeyScreenshots ?? 3, 5))\n }\n catch {\n if (!closing && config === activeConfig)\n missing.add('key-screenshot-unavailable')\n }\n })().finally(() => {\n keyScreenshotPromise = undefined\n })\n return keyScreenshotPromise\n }\n\n function takeScreenshot(activeConfig: FeedbackClientConfig): Promise<Uint8Array> {\n if (captureTask) {\n // 旧身份或已取消的底层任务不能复用;超时不代表 DOM 渲染已经停止。\n if (captureTask.config !== activeConfig || captureTask.controller.signal.aborted)\n return Promise.reject(new Error('Screenshot task is still stopping'))\n return bounded(captureTask.promise, activeConfig.screenshotTimeoutMs ?? 3000, captureTask.controller)\n }\n const controller = new AbortController()\n // rrweb 即使遮挡 iframe 也会观察其文档。暂停自己的记录器,避免采集 html2canvas 的克隆及样式变更。\n screenshotCaptures++\n stopReplay?.()\n stopReplay = undefined\n const captured = (async () => {\n try {\n const bytes = await (activeConfig.captureScreenshot?.({ signal: controller.signal }) ?? captureFeedbackScreenshot(controller.signal))\n controller.signal.throwIfAborted()\n return bytes\n }\n finally {\n // 等待句柄登记完成,覆盖宿主截图函数同步抛错的路径。\n await Promise.resolve()\n screenshotCaptures--\n captureTask = undefined\n if (!screenshotCaptures && !closing && config?.replay && replayRequested)\n await startReplay(config)\n }\n })()\n captureTask = { promise: captured, controller, config: activeConfig }\n return bounded(captured, activeConfig.screenshotTimeoutMs ?? 3000, controller)\n }\n\n async function doPrepare(): Promise<HaiResult<FeedbackDraft>> {\n if (!config || closing)\n return failure('NOT_INITIALIZED')\n const activeConfig = config\n if (draft?.report && !collectionFinished) {\n // 新反馈开始前先确认上一份待传材料,不能以关闭弹窗丢弃附件。\n if (Date.now() < deadline && afterCount < limits().after)\n draft.missing.push('collection-ended-by-new-feedback')\n deadline = Date.now()\n const settled = await flush()\n if (!settled.success)\n return settled\n if (closing || config !== activeConfig)\n return failure('NOT_INITIALIZED')\n }\n if (draft && !collectionFinished) {\n if (!draft.submission && config.screenshot !== false && preparedPage !== pageIdentity()) {\n const captured = await captureScreenshot()\n if (!captured.success)\n return captured\n }\n replayRequested = true\n if (config.replay && !stopReplay)\n await startReplay(config)\n return ok(draft)\n }\n collectionFinished = false\n collectionSealed = false\n initialIds.clear()\n uploadedIds.clear()\n const now = Date.now()\n buffer = buffer.filter(item => item.timestamp >= now - limits().age)\n bufferBytes = new TextEncoder().encode(JSON.stringify(buffer)).byteLength\n errorWindows = errorWindows.filter(window => window.anchor.timestamp >= now - limits().age)\n const frozenWindow = errorWindows.at(-1)\n const anchor = frozenWindow?.anchor ?? (lastError && lastError.timestamp >= now - limits().age && buffer.some(item => item.id === lastError?.id) ? lastError : undefined)\n const logs = buffer.filter(item => item.kind === 'log' || item.kind === 'error')\n const anchorIndex = anchor ? logs.findIndex(item => item.id === anchor.id) : logs.length\n const anchorIndexes = anchor ? logs.map((item, index) => item.kind === 'error' ? index : -1).filter(index => index >= 0).slice(-10) : []\n const selectedIds = new Set<string>()\n const selected = anchor\n ? (errorWindows.length ? errorWindows.flatMap(window => window.evidence) : anchorIndexes.flatMap(index => logs.slice(Math.max(0, index - limits().before), index + 1 + limits().after))).filter((item) => {\n if (selectedIds.has(item.id))\n return false\n selectedIds.add(item.id)\n return true\n }).sort((a, b) => a.sequence - b.sequence)\n : logs.slice(Math.max(0, logs.length - limits().before))\n const other = buffer.filter(item => item.kind !== 'log' && item.kind !== 'error').slice(-100)\n if (keyScreenshotPromise)\n await keyScreenshotPromise\n if (closing || config !== activeConfig)\n return failure('NOT_INITIALIZED')\n keyScreenshots = keyScreenshots.filter(item => item.timestamp >= now - limits().age)\n draft = { submissionId: core.id.uuid(), anchorTime: anchor?.timestamp ?? now, anchorKind: anchor ? 'error' : 'feedback', errorId: anchor?.errorId, evidence: [...selected, ...other, ...replayChunks.flat()].sort((a, b) => a.sequence - b.sequence), attachments: [], missing: [...missing], expiresAt: now + 86_400_000 }\n while (draft.evidence.length > limits().events || new TextEncoder().encode(JSON.stringify(draft.evidence)).byteLength > limits().bytes) {\n draft.evidence.shift()\n missing.add('browser-draft-truncated')\n }\n draftBytes = new TextEncoder().encode(JSON.stringify(draft.evidence)).byteLength\n if (dropped)\n draft.missing.push(`browser-buffer-truncated:${dropped}`)\n afterCount = frozenWindow?.after ?? (anchor ? Math.max(0, logs.length - anchorIndex - 1) : 0)\n deadline = (anchor?.timestamp ?? now) + (config.afterTimeoutMs ?? 30_000)\n recordEnvironment()\n if (config.screenshot !== false) {\n const current = draft\n const captured = await captureScreenshot(undefined, 'screenshot.png')\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (!captured.success) {\n current.missing.push(captured.error.code === HaiFeedbackError.LIMIT_EXCEEDED.code ? 'screenshot-size-limit-exceeded' : 'screenshot-unavailable')\n current.missing.push(`screenshot-error:${captured.error.message.slice(0, 300)}`)\n }\n }\n // 当前页面优先占预算,历史关键帧只能使用剩余额度。\n for (const { attachment: image } of keyScreenshots) {\n if (image.size > budget.maxAttachmentBytes || draft.attachments.length >= budget.maxAttachmentCount || draft.attachments.reduce((sum, file) => sum + file.size, image.size) > budget.maxAttachmentsBytes)\n draft.missing.push('key-screenshot-budget-exceeded')\n else draft.attachments.push(image)\n }\n replayRequested = true\n if (config.replay && !stopReplay)\n await startReplay(config)\n schedulePersist()\n preparedPage = pageIdentity()\n return ok(draft)\n }\n\n function prepare(): Promise<HaiResult<FeedbackDraft>> {\n preparePromise ??= doPrepare().finally(() => {\n preparePromise = undefined\n })\n return preparePromise\n }\n\n function recordEnvironment() {\n if (!config)\n return\n record({ kind: 'environment', data: { appId: config.appId, appVersion: config.appVersion, buildId: config.buildId, commit: config.commit, url: feedbackPageUrl(location.href), browser: navigator.userAgent, language: navigator.language, timezone: new Intl.DateTimeFormat().resolvedOptions().timeZone, viewport: { width: innerWidth, height: innerHeight, pixelRatio: devicePixelRatio }, online: navigator.onLine, cookies: collectFeedbackCookies(document.cookie, config.cookieAllowlist ?? []) } })\n }\n\n /** Hash 路由只在会话内用于换页识别,不把片段中的参数写入诊断材料。 */\n function pageIdentity() {\n return `${location.origin}${location.pathname}${location.hash.startsWith('#/') ? location.hash.split('?')[0] : ''}`\n }\n\n async function captureScreenshot(attachmentId?: string, name?: string): Promise<HaiResult<void>> {\n if (!config || !draft || closing)\n return failure('NOT_INITIALIZED')\n const current = draft\n const activeConfig = config\n const previous = attachmentId ? current.attachments.find(item => item.id === attachmentId) : undefined\n const previousChecksum = previous?.checksum\n if (current.submission)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n if (attachmentId && (!previous || !previous.contentType.startsWith('image/')))\n return failure('INVALID_INPUT')\n if (!previous && current.attachments.length >= budget.maxAttachmentCount)\n return failure('LIMIT_EXCEEDED')\n try {\n const bytes = await takeScreenshot(activeConfig)\n if (bytes.byteLength > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const previousName = previous && (/\\.[^.]+$/.test(previous.name) ? previous.name.replace(/\\.[^.]+$/, '.png') : `${previous.name}.png`)\n const image = await attachment(name ?? previousName ?? `screenshot-${core.id.uuid()}.png`, 'image/png', bytes)\n if (closing || config !== activeConfig || draft !== current || current.submission || (previous && (!current.attachments.includes(previous) || previous.checksum !== previousChecksum)))\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n if (current.attachments.reduce((total, item) => total + (item === previous ? 0 : item.size), image.size) > budget.maxAttachmentsBytes)\n return failure('LIMIT_EXCEEDED')\n if (previous)\n current.attachments = current.attachments.map(item => item === previous ? { ...image, id: previous.id } : item)\n else if (current.attachments.length < budget.maxAttachmentCount)\n current.attachments.unshift(image)\n else\n return failure('LIMIT_EXCEEDED')\n if (!name)\n recordEnvironment()\n preparedPage = pageIdentity()\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n async function submit(input: FeedbackClientSubmitInput = {}): Promise<HaiResult<FeedbackReport>> {\n if (!config || closing)\n return failure('NOT_INITIALIZED')\n const activeConfig = config\n const prepared = preparePromise ? await preparePromise : draft ? ok(draft) : await prepare()\n if (!prepared.success)\n return prepared\n const current = prepared.data\n try {\n if (!policyVerified && activeConfig.actions.policy) {\n const policy = await activeConfig.actions.policy()\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (!policy.success)\n return policy\n budget = FeedbackBudgetSchema.parse(policy.data)\n policyVerified = true\n missing.delete('server-policy-unavailable')\n current.missing = current.missing.filter(reason => reason !== 'server-policy-unavailable')\n while (current.evidence.length && (current.evidence.length > limits().events || new TextEncoder().encode(JSON.stringify(current.evidence)).byteLength > limits().bytes)) {\n current.evidence.shift()\n if (!current.missing.includes('browser-draft-truncated'))\n current.missing.push('browser-draft-truncated')\n }\n draftBytes = new TextEncoder().encode(JSON.stringify(current.evidence)).byteLength\n }\n const fingerprint = await digestHex(new TextEncoder().encode(JSON.stringify({ description: sanitizeFeedbackData({ text: input.description ?? '' }).text, category: input.category ?? '', contact: sanitizeFeedbackData({ text: input.contact ?? '' }).text, files: (input.files ?? []).map(item => ({ name: item.name, size: item.size, lastModified: item.lastModified })), removed: [...(input.removedAttachmentIds ?? [])].sort() })))\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (current.submission && current.userInputFingerprint && fingerprint !== current.userInputFingerprint)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n if (!current.submission && input.removedAttachmentIds?.length)\n current.attachments = current.attachments.filter(item => !input.removedAttachmentIds?.includes(item.id))\n if (!current.submission) {\n const added = await addFiles(input.files ?? [])\n if (!added.success)\n return added\n }\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n current.submission ??= FeedbackSubmitInputSchema.parse({ submissionId: current.submissionId, appId: config.appId, appVersion: config.appVersion, buildId: config.buildId, commit: config.commit, description: typeof input.description === 'string' ? String(sanitizeFeedbackData({ text: input.description }).text) : undefined, category: input.category, contact: input.contact, url: feedbackPageUrl(location.href), anchor: { kind: current.anchorKind, timestamp: current.anchorTime, errorId: current.errorId }, evidence: current.evidence, attachments: current.attachments.map(({ bytes: _bytes, ...metadata }) => metadata) })\n current.userInputFingerprint = fingerprint\n schedulePersist()\n const result = await activeConfig.actions.submit(current.submission)\n if (!result.success)\n return result\n if (closing || config !== activeConfig || draft !== current)\n return result\n current.report = result.data\n initialIds = new Set(current.submission.evidence?.map(item => item.id))\n schedulePersist()\n // 已受理立即返回;大附件和后续日志由可重试的后台 flush 续传。\n void flush()\n return result\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n async function doFlush(): Promise<HaiResult<void>> {\n if (!config || !draft?.report)\n return failure('NOT_INITIALIZED')\n if (collectionFinished)\n return ok(undefined)\n try {\n for (const item of draft.attachments) {\n if (uploadedIds.has(item.id))\n continue\n const result = await config.actions.upload({ id: draft.report.id, attachmentId: item.id, dataBase64: base64(item.bytes) })\n if (!result.success)\n return result\n uploadedIds.add(item.id)\n }\n let drainPasses = 0\n while (true) {\n if (closing || Date.now() >= deadline || afterCount >= limits().after)\n collectionSealed = true\n const pending = draft.evidence.filter(item => !initialIds.has(item.id)).slice(0, 200)\n if (pending.length === 0)\n break\n const result = await config.actions.appendEvidence({ id: draft.report.id, evidence: pending })\n if (!result.success)\n return result\n for (const id of result.data.acknowledged)\n initialIds.add(id)\n if (pending.some(item => !initialIds.has(item.id)))\n return failure()\n drainPasses++\n if (drainPasses >= budget.maxAttachmentCount)\n return ok(undefined)\n }\n if (collectionSealed) {\n const result = await config.actions.completeCollection({ id: draft.report.id, missing: [...new Set([...draft.missing, ...missing])] })\n if (!result.success)\n return result\n collectionFinished = true\n if (config.replayStart !== 'init')\n pause()\n const updatedReport = FeedbackReportSchema.safeParse(result.data)\n if (updatedReport.success)\n draft.report = updatedReport.data\n if (config.persistDraft)\n await deleteFeedbackDraft(storageKey)\n }\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n function flush(): Promise<HaiResult<void>> {\n flushPromise ??= doFlush().finally(() => {\n flushPromise = undefined\n })\n return flushPromise\n }\n\n async function annotate(id: string, mark: Parameters<typeof annotateFeedbackImage>[1]): Promise<HaiResult<void>> {\n if (!draft || closing)\n return failure('NOT_INITIALIZED')\n const current = draft\n const item = current.attachments.find(value => value.id === id)\n if (!item || current.submission)\n return failure('INVALID_INPUT')\n const originalBytes = item.bytes\n try {\n const bytes = await annotateFeedbackImage(originalBytes, mark)\n const name = /\\.[^.]+$/.test(item.name) ? item.name.replace(/\\.[^.]+$/, '.png') : `${item.name}.png`\n const updated = await attachment(name, 'image/png', bytes)\n if (updated.size > budget.maxAttachmentBytes || current.attachments.reduce((sum, file) => sum + (file === item ? 0 : file.size), updated.size) > budget.maxAttachmentsBytes)\n return failure('LIMIT_EXCEEDED')\n // 渲染/摘要结束后再原子替换;提交、关闭、删除或另一标注不能被旧异步结果覆盖。\n if (closing || draft !== current || current.submission || !current.attachments.includes(item) || item.bytes !== originalBytes)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n Object.assign(item, updated, { id })\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n async function addFiles(files: readonly File[], removedAttachmentIds: readonly string[] = []): Promise<HaiResult<void>> {\n if (!draft)\n return failure('NOT_INITIALIZED')\n if (draft.submission && (files.length || removedAttachmentIds.length))\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n const current = draft\n const items: FeedbackClientAttachment[] = []\n const newMissing: string[] = []\n try {\n for (const file of files) {\n if (items.length >= budget.maxAttachmentCount || file.size > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const contentType = feedbackFileContentType(file)\n if (!contentType)\n return failure('INVALID_INPUT', undefined, feedbackM('feedback_unsupportedAttachmentType'))\n let bytes: Uint8Array\n if (contentType.startsWith('text/') || contentType === 'application/json') {\n const raw = await file.text()\n if (contentType === 'application/json' && raw.length > 8192)\n newMissing.push(`attachment-text-truncated:${String(sanitizeFeedbackData({ text: file.name }).text).slice(0, 100)}`)\n bytes = contentType === 'application/json'\n ? new TextEncoder().encode(JSON.stringify(sanitizeFeedbackData(JSON.parse(raw))))\n : new TextEncoder().encode(sanitizeFeedbackText(raw))\n }\n else {\n bytes = new Uint8Array(await file.arrayBuffer())\n }\n if (bytes.byteLength > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const item = await attachment(file.name, contentType, bytes)\n if (!items.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n items.push(item)\n }\n // 读取/摘要计算期间草稿可能切换或冻结;失败批次不能留下附件或缺失标记。\n if (draft !== current || closing)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n if (current.submission && (files.length || removedAttachmentIds.length))\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n // 在最新附件上合并,保留读取期间另一成功批次的新增项;最终校验与提交之间没有 await。\n const merged = current.attachments.filter(file => !removedAttachmentIds.includes(file.id))\n for (const item of items) {\n if (!merged.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n merged.push(item)\n }\n if (merged.length > budget.maxAttachmentCount || merged.reduce((total, item) => total + item.size, 0) > budget.maxAttachmentsBytes)\n return failure('LIMIT_EXCEEDED')\n current.attachments = merged\n current.missing.push(...newMissing)\n schedulePersist()\n return ok(undefined)\n }\n catch (cause) {\n return failure('INVALID_INPUT', cause)\n }\n }\n\n async function exportDraft(input: FeedbackClientSubmitInput = {}): Promise<HaiResult<Uint8Array>> {\n if (!draft)\n return failure('NOT_INITIALIZED')\n try {\n const { createFeedbackBundle } = await import('../bundle/index.js')\n const attachments = [...draft.attachments]\n if (!draft.submission) {\n const added = await addFiles(input.files ?? [])\n if (!added.success)\n return added\n attachments.splice(0, attachments.length, ...draft.attachments)\n }\n else {\n // 离线兜底保留失败后新增的本地文件,但不改变已发送包络或后续上传队列。\n for (const file of input.files ?? []) {\n if (attachments.length >= budget.maxAttachmentCount || file.size > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const contentType = feedbackFileContentType(file)\n if (!contentType)\n return failure('INVALID_INPUT', undefined, feedbackM('feedback_unsupportedAttachmentType'))\n const bytes = contentType === 'application/json'\n ? new TextEncoder().encode(JSON.stringify(sanitizeFeedbackData(JSON.parse(await file.text()))))\n : contentType.startsWith('text/') ? new TextEncoder().encode(sanitizeFeedbackText(await file.text())) : new Uint8Array(await file.arrayBuffer())\n if (bytes.byteLength > budget.maxAttachmentBytes)\n return failure('LIMIT_EXCEEDED')\n const item = await attachment(file.name, contentType, bytes)\n if (!attachments.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n attachments.push(item)\n }\n }\n return createFeedbackBundle({ maxBytes: budget.maxTotalBytes, report: { ...(draft.report ?? { id: draft.submissionId, appId: config?.appId, appVersion: config?.appVersion, buildId: config?.buildId, commit: config?.commit, url: draft.evidence.filter(item => item.kind === 'environment').at(-1)?.data.url, anchor: { kind: draft.anchorKind, timestamp: draft.anchorTime }, evidenceRevision: 1 }), ...sanitizeFeedbackData({ description: input.description ?? draft.report?.description ?? '', category: input.category, contact: input.contact }) }, evidence: draft.evidence, attachments: attachments.filter(item => !input.removedAttachmentIds?.includes(item.id)), missing: [...new Set([...draft.missing, ...missing, ...(!draft.report ? ['server-evidence-not-obtained', 'feedback-not-yet-accepted'] : [])])] })\n }\n catch (cause) {\n return failure('OPERATION_FAILED', cause)\n }\n }\n\n function close(options: { discard?: boolean } = {}): Promise<void> {\n sessionVersion++\n discardOnClose ||= options.discard === true\n closePromise ??= doClose().finally(() => {\n closePromise = undefined\n })\n return closePromise\n }\n\n function pause(): void {\n replayRequested = false\n stopReplay?.()\n stopReplay = undefined\n captureTask?.controller.abort()\n }\n\n async function doClose(): Promise<void> {\n closing = true\n pause()\n saveController.abort()\n unsubscribeLogger?.()\n unsubscribeLogger = undefined\n stopReplay?.()\n stopReplay = undefined\n for (const cleanup of cleanups.splice(0))\n cleanup()\n if (flushTimer)\n clearInterval(flushTimer)\n if (persistTimer)\n clearTimeout(persistTimer)\n flushTimer = undefined\n persistTimer = undefined\n // 截图有既定超时;等待采集退出后再清空草稿,避免旧回调复活会话。\n await preparePromise\n await keyScreenshotPromise\n if (draft?.report)\n await flush()\n if (discardOnClose && storageKey)\n await deleteFeedbackDraft(storageKey).catch(() => undefined)\n else if (config?.persistDraft && draft && !collectionFinished)\n await saveFeedbackDraft(storageKey, draft).catch(() => undefined)\n releasePreviews()\n discardOnClose = false\n config = undefined\n preparedPage = ''\n buffer = []\n bufferBytes = 0\n draft = undefined\n lastError = undefined\n errorWindows = []\n replayChunks = []\n replayRequested = false\n keyScreenshots = []\n lastKeyScreenshot = 0\n initialIds.clear()\n uploadedIds.clear()\n missing.clear()\n dropped = 0\n collectionFinished = false\n collectionSealed = false\n }\n\n return { init, prepare, pause, captureScreenshot, submit, flush, record, getDraft: () => draft, getView, releasePreviews, annotate, addFiles, exportDraft, async saveDraft(input) {\n const session = config\n const exported = await exportDraft(input)\n if (!exported.success)\n return exported\n if (closing || !session || session !== config)\n return failure('NOT_INITIALIZED')\n return saveFeedbackFile(exported.data, `feedback-${draft?.submissionId ?? 'local'}.zip`, 'application/zip', saveController.signal)\n }, close, get budget() {\n return { ...budget }\n } }\n}\n\n/**\n * 默认浏览器采集会话。\n * @example\n * ```ts\n * import { feedbackClient } from '@h-ai/feedback/client'\n * const draft = feedbackClient.getDraft()\n * ```\n */\nexport const feedbackClient = createFeedbackClient()\n\nasync function bounded<T>(promise: Promise<T>, ms: number, controller: AbortController): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n let aborted: (() => void) | undefined\n try {\n return await Promise.race([promise, new Promise<never>((_resolve, reject) => {\n aborted = () => reject(new Error('Capture cancelled'))\n if (controller.signal.aborted)\n aborted()\n else controller.signal.addEventListener('abort', aborted, { once: true })\n timer = setTimeout(() => {\n reject(new Error('Capture timed out'))\n controller.abort()\n }, ms)\n })])\n }\n finally {\n clearTimeout(timer)\n if (aborted)\n controller.signal.removeEventListener('abort', aborted)\n }\n}\n\nasync function attachment(name: string, contentType: string, bytes: Uint8Array): Promise<FeedbackClientAttachment> {\n const checksum = await digestHex(bytes)\n return { id: core.id.uuid(), name: String(sanitizeFeedbackData({ text: name }).text).slice(0, 255), contentType, size: bytes.byteLength, checksum, bytes }\n}\n\nasync function digestHex(bytes: Uint8Array): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', new Uint8Array(bytes))\n return [...new Uint8Array(digest)].map(value => value.toString(16).padStart(2, '0')).join('')\n}\n\nfunction base64(bytes: Uint8Array): string {\n let value = ''\n for (let offset = 0; offset < bytes.length; offset += 32_768)\n value += String.fromCharCode(...bytes.subarray(offset, offset + 32_768))\n return btoa(value)\n}\n","/** 详情接入统一处理导出轮询、回放分页和取消,不依赖 UI 或平台 SDK。 */\nimport type { FeedbackAttachmentData, FeedbackDetail, FeedbackEvidence, FeedbackEvidenceQuery, FeedbackExportInput, FeedbackJob, FeedbackRetryInput } from '@h-ai/api-contract/feedback'\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport { err, ok } from '@h-ai/core'\nimport { feedbackM } from '../feedback-i18n.js'\nimport { HaiFeedbackError } from '../feedback-types.js'\nimport { feedbackDataBytes, saveFeedbackFile } from './feedback-client-files.js'\n\n/**\n * 管理接口可直接传入 typedClient.feedback.reports;授权由服务端再次核验。\n * @example\n * ```ts\n * import type { FeedbackReviewActions } from '@h-ai/feedback/client'\n * function load(actions: FeedbackReviewActions) { return actions.get({ id: 'report-id' }) }\n * ```\n */\nexport interface FeedbackReviewActions {\n get: (input: { id: string }) => Promise<HaiResult<FeedbackDetail>>\n getEvidence: (input: FeedbackEvidenceQuery) => Promise<HaiResult<PaginatedResult<FeedbackEvidence>>>\n export: (input: FeedbackExportInput) => Promise<HaiResult<FeedbackJob>>\n getExport: (input: { id: string, jobId: string }) => Promise<HaiResult<FeedbackAttachmentData>>\n retry: (input: FeedbackRetryInput) => Promise<HaiResult<unknown>>\n}\n\n/**\n * 创建可取消的详情动作;退出账号调用 close,旧轮询不能继续下载到新会话。\n * @example\n * ```ts\n * import { createFeedbackReview, type FeedbackReviewActions } from '@h-ai/feedback/client'\n * async function exportReport(actions: FeedbackReviewActions) {\n * const review = createFeedbackReview(actions)\n * const result = await review.exportReport('report-id')\n * review.close()\n * return result\n * }\n * ```\n */\nexport function createFeedbackReview(actions: FeedbackReviewActions) {\n let controller = new AbortController()\n const failed = () => err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n return {\n close() {\n controller.abort()\n controller = new AbortController()\n },\n async retryReport(id: string): Promise<HaiResult<void>> {\n const signal = controller.signal\n try {\n const loaded = await actions.get({ id })\n if (signal.aborted)\n return failed()\n if (!loaded.success)\n return loaded\n const targets = new Set<'collect' | 'notify' | 'webhook'>()\n if (['partial', 'failed'].includes(loaded.data.report.collectionStatus))\n targets.add('collect')\n for (const job of loaded.data.jobs) {\n if (job.status === 'failed' && (job.type === 'collect' || job.type === 'notify' || job.type === 'webhook'))\n targets.add(job.type)\n }\n for (const target of targets) {\n if (signal.aborted)\n return failed()\n const retried = await actions.retry({ id, target })\n if (signal.aborted)\n return failed()\n if (!retried.success)\n return retried\n }\n return ok(undefined)\n }\n catch {\n return failed()\n }\n },\n async loadReplay(id: string): Promise<HaiResult<FeedbackEvidence[]>> {\n const signal = controller.signal\n const events: FeedbackEvidence[] = []\n try {\n for (let page = 1; page <= 100; page++) {\n const result = await actions.getEvidence({ id, kind: 'replay', page, pageSize: 100 })\n if (signal.aborted)\n return failed()\n if (!result.success)\n return result\n events.push(...result.data.items)\n if (events.length >= result.data.total || !result.data.items.length)\n return ok(events)\n }\n }\n catch {\n return failed()\n }\n return failed()\n },\n async exportReport(id: string) {\n const signal = controller.signal\n try {\n const started = await actions.export({ id })\n if (!started.success)\n return started\n for (let attempt = 0; attempt < 120; attempt++) {\n if (signal.aborted)\n return failed()\n const detail = await actions.get({ id })\n if (!detail.success)\n return detail\n if (signal.aborted)\n return failed()\n const job = detail.data.jobs.find(job => job.id === started.data.id)\n if (!job || job.status === 'failed')\n return failed()\n if (job.status === 'succeeded') {\n const file = await actions.getExport({ id, jobId: job.id })\n if (signal.aborted)\n return failed()\n return file.success ? saveFeedbackFile(feedbackDataBytes(file.data), file.data.name, file.data.contentType, signal) : file\n }\n await new Promise<void>((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', done)\n resolve()\n }\n timer = setTimeout(done, 500)\n signal.addEventListener('abort', done, { once: true })\n })\n }\n }\n catch {\n return failed()\n }\n return failed()\n },\n }\n}\n"]}
|