@h-ai/feedback 0.0.0-stage → 0.1.0-alpha.69
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/LICENSE +202 -0
- package/README.en.md +115 -0
- package/README.ja.md +115 -0
- package/README.md +116 -2
- package/dist/bundle/index.d.ts +212 -0
- package/dist/bundle/index.js +3 -0
- package/dist/bundle/index.js.map +1 -0
- package/dist/chunk-43AOXE4W.js +333 -0
- package/dist/chunk-43AOXE4W.js.map +1 -0
- package/dist/chunk-DYEK2FNM.js +101 -0
- package/dist/chunk-DYEK2FNM.js.map +1 -0
- package/dist/client/index.d.ts +187 -0
- package/dist/client/index.js +889 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.js +1396 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/feedback-client-image.ts","../../src/client/feedback-client-sanitize.ts","../../src/client/feedback-client-store.ts","../../src/client/feedback-client-main.ts"],"names":["core","window","entry"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 截图与标注都在浏览器侧执行,不把原始 DOM 上传到受理服务。\n * 标注坐标使用浏览器解码后原图的像素;UI 的 0–1 坐标需将 x/width 乘 naturalWidth、y/height 乘 naturalHeight。\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 x: number\n y: number\n width: number\n height: number\n mode: 'mask' | 'outline'\n}\n\nconst PRIVATE_SELECTOR = 'input,textarea,select,[contenteditable]:not([contenteditable=\"false\"]),[data-feedback-private],.rr-block,.rr-mask'\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: Math.min(window.innerWidth, 1920),\n height: Math.min(window.innerHeight, 1200),\n scale: 1,\n // 原生 SVG foreignObject 保留 CSS mask 图标与字体基线,避免 CanvasRenderer 裁切文本。\n foreignObjectRendering: true,\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)) {\n const bounds = element.getBoundingClientRect()\n const replacement = clone.createElement('div')\n replacement.style.cssText = `width:${bounds.width}px;height:${bounds.height}px;background:#111;color:transparent;overflow:hidden`\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 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 context.fillRect(annotation.x, annotation.y, annotation.width, annotation.height)\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)$/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' && typeof content === 'string' && /url\\s*\\(/i.test(content)) {\n attributes.style = sanitizeFeedbackText(content).replace(/url\\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 { FeedbackEvidenceInputSchema, FeedbackReportSchema, FeedbackSubmitInputSchema } 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 { 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/**\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 initializing = false\n let draft: FeedbackDraft | undefined\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 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) {\n const key = code === 'NOT_INITIALIZED' ? 'feedback_notInitialized' : code === 'LIMIT_EXCEEDED' ? 'feedback_limitExceeded' : code === 'INVALID_INPUT' ? 'feedback_invalidInput' : 'feedback_operationFailed'\n return err(HaiFeedbackError[code], feedbackM(key), cause)\n }\n\n function limits() {\n return { events: config?.maxEvents ?? 1000, bytes: config?.maxBytes ?? 2 * 1024 * 1024, 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 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 config = input\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 : 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)\n return\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 inlineImages: true,\n inlineStylesheet: true,\n collectFonts: false,\n checkoutEveryNms: 30_000,\n emit: (event, isCheckout) => {\n if (isCheckout || replayChunks.length === 0)\n replayChunks.push([])\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 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 bounded(activeConfig.captureScreenshot?.() ?? captureFeedbackScreenshot(), activeConfig.screenshotTimeoutMs ?? 3000)\n if (closing || config !== activeConfig)\n return\n if (bytes.byteLength > 5 * 1024 * 1024) {\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 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 return ok(draft)\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: keyScreenshots.map(item => item.attachment), 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 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 if (config.screenshot !== false) {\n const current = draft\n try {\n const bytes = await bounded(config.captureScreenshot?.() ?? captureFeedbackScreenshot(), config.screenshotTimeoutMs ?? 3000)\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n if (bytes.byteLength > 5 * 1024 * 1024) {\n current.missing.push('screenshot-size-limit-exceeded')\n }\n else {\n const image = await attachment('screenshot.png', 'image/png', bytes)\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n current.attachments.push(image)\n }\n }\n catch (cause) {\n if (closing || config !== activeConfig || draft !== current)\n return failure('NOT_INITIALIZED')\n current.missing.push('screenshot-unavailable')\n if (cause instanceof Error)\n current.missing.push(`screenshot-error:${String(sanitizeFeedbackData({ message: cause.message }).message).slice(0, 300)}`)\n }\n }\n schedulePersist()\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 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 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 >= 20)\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 // 渲染/摘要结束后再原子替换;提交、关闭、删除或另一标注不能被旧异步结果覆盖。\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[]): Promise<HaiResult<void>> {\n if (!draft)\n return failure('NOT_INITIALIZED')\n if (draft.submission && files.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 >= 20 || file.size > 5 * 1024 * 1024)\n return failure('LIMIT_EXCEEDED')\n if (!['image/png', 'image/jpeg', 'image/webp', 'text/plain', 'application/json'].includes(file.type))\n return failure('INVALID_INPUT')\n let bytes: Uint8Array\n if (file.type.startsWith('text/') || file.type === 'application/json') {\n const raw = await file.text()\n if (file.type === 'application/json' && raw.length > 8192)\n newMissing.push(`attachment-text-truncated:${String(sanitizeFeedbackData({ text: file.name }).text).slice(0, 100)}`)\n bytes = file.type === '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 > 5 * 1024 * 1024)\n return failure('LIMIT_EXCEEDED')\n const item = await attachment(file.name, file.type, 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)\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_retryInputChanged'))\n // 在最新附件上合并,保留读取期间另一成功批次的新增项;最终校验与提交之间没有 await。\n const merged = [...current.attachments]\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 > 20)\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 >= 20 || file.size > 5 * 1024 * 1024)\n return failure('LIMIT_EXCEEDED')\n if (!['image/png', 'image/jpeg', 'image/webp', 'text/plain', 'application/json'].includes(file.type))\n return failure('INVALID_INPUT')\n const bytes = file.type === 'application/json'\n ? new TextEncoder().encode(JSON.stringify(sanitizeFeedbackData(JSON.parse(await file.text()))))\n : file.type.startsWith('text/') ? new TextEncoder().encode(sanitizeFeedbackText(await file.text())) : new Uint8Array(await file.arrayBuffer())\n if (bytes.byteLength > 5 * 1024 * 1024)\n return failure('LIMIT_EXCEEDED')\n const item = await attachment(file.name, file.type, bytes)\n if (!attachments.some(existing => existing.name === item.name && existing.checksum === item.checksum))\n attachments.push(item)\n }\n }\n return createFeedbackBundle({ report: { ...(draft.report ?? { id: draft.submissionId, appId: config?.appId, 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(): Promise<void> {\n closePromise ??= doClose().finally(() => {\n closePromise = undefined\n })\n return closePromise\n }\n\n async function doClose(): Promise<void> {\n closing = true\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 (config?.persistDraft && draft && !collectionFinished)\n await saveFeedbackDraft(storageKey, draft).catch(() => undefined)\n config = undefined\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, submit, flush, record, getDraft: () => draft, annotate, addFiles, exportDraft, close }\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"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as _h_ai_core from '@h-ai/core';
|
|
3
|
+
import { HaiResult, PaginatedResult } from '@h-ai/core';
|
|
4
|
+
import { FeedbackSubmitInput, FeedbackReport, FeedbackListInput, FeedbackDetail, FeedbackEvidenceQuery, FeedbackEvidence, FeedbackSetStatusInput, FeedbackAppendEvidenceInput, FeedbackCompleteInput, FeedbackUploadInput, FeedbackAttachment, FeedbackAttachmentData, FeedbackRetryInput, FeedbackExportInput, FeedbackJob } from '@h-ai/api-contract/feedback';
|
|
5
|
+
export { FeedbackAppendEvidenceInput, FeedbackAttachment, FeedbackAttachmentData, FeedbackCompleteInput, FeedbackDetail, FeedbackEvidence, FeedbackEvidenceQuery, FeedbackExportInput, FeedbackJob, FeedbackListInput, FeedbackReport, FeedbackRetryInput, FeedbackSetStatusInput, FeedbackSubmitInput, FeedbackUploadInput } from '@h-ai/api-contract/feedback';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Feedback 服务端配置,不包含依赖模块凭据;连接由宿主初始化。
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { FeedbackConfigSchema } from '@h-ai/feedback'
|
|
12
|
+
* const config = FeedbackConfigSchema.parse({ appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' })
|
|
13
|
+
* void config.retentionDays
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
declare const FeedbackConfigSchema: z.ZodObject<{
|
|
17
|
+
appId: z.ZodString;
|
|
18
|
+
appVersion: z.ZodOptional<z.ZodString>;
|
|
19
|
+
buildId: z.ZodOptional<z.ZodString>;
|
|
20
|
+
commit: z.ZodOptional<z.ZodString>;
|
|
21
|
+
recipients: z.ZodArray<z.ZodEmail>;
|
|
22
|
+
notificationProvider: z.ZodDefault<z.ZodString>;
|
|
23
|
+
adminUrl: z.ZodURL;
|
|
24
|
+
collectionTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
25
|
+
workerIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
leaseMs: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
maxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
28
|
+
retentionDays: z.ZodDefault<z.ZodNumber>;
|
|
29
|
+
envAllowlist: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
30
|
+
maxAttachmentBytes: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
maxEvidenceBytes: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
maxEvidenceCount: z.ZodDefault<z.ZodNumber>;
|
|
33
|
+
}, z.core.$strict>;
|
|
34
|
+
/**
|
|
35
|
+
* 已校验服务端配置,默认项均已补齐。
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import type { FeedbackConfig } from '@h-ai/feedback'
|
|
39
|
+
* function describeRetention(config: FeedbackConfig) { return `${config.appId}: ${config.retentionDays} days` }
|
|
40
|
+
* void describeRetention
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
type FeedbackConfig = z.infer<typeof FeedbackConfigSchema>;
|
|
44
|
+
/**
|
|
45
|
+
* 服务端输入配置,默认项可省略。
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import type { FeedbackConfigInput } from '@h-ai/feedback'
|
|
49
|
+
* const config: FeedbackConfigInput = { appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' }
|
|
50
|
+
* void config
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
type FeedbackConfigInput = z.input<typeof FeedbackConfigSchema>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Feedback 错误定义。
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { HaiFeedbackError } from '@h-ai/feedback'
|
|
60
|
+
* const code = HaiFeedbackError.NOT_FOUND.code
|
|
61
|
+
* void code
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
declare const HaiFeedbackError: {
|
|
65
|
+
NOT_INITIALIZED: _h_ai_core.HaiErrorDef;
|
|
66
|
+
INIT_IN_PROGRESS: _h_ai_core.HaiErrorDef;
|
|
67
|
+
CONFIG_ERROR: _h_ai_core.HaiErrorDef;
|
|
68
|
+
OPERATION_FAILED: _h_ai_core.HaiErrorDef;
|
|
69
|
+
NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
70
|
+
FORBIDDEN: _h_ai_core.HaiErrorDef;
|
|
71
|
+
CONFLICT: _h_ai_core.HaiErrorDef;
|
|
72
|
+
LIMIT_EXCEEDED: _h_ai_core.HaiErrorDef;
|
|
73
|
+
INVALID_INPUT: _h_ai_core.HaiErrorDef;
|
|
74
|
+
CHECKSUM_MISMATCH: _h_ai_core.HaiErrorDef;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 由可信服务端认证与授权策略生成的范围;HTTP 输入不能指定此对象。
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* import type { FeedbackContext } from '@h-ai/feedback'
|
|
81
|
+
* const context: FeedbackContext = { scopeId: 'tenant-1', userId: 'user-1', permissions: ['feedback:create'] }
|
|
82
|
+
* void context
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
interface FeedbackContext {
|
|
86
|
+
scopeId: string;
|
|
87
|
+
userId: string;
|
|
88
|
+
permissions?: readonly string[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 反馈服务对象;领域操作返回 HaiResult,close 不释放宿主依赖连接。
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* import type { FeedbackContext, FeedbackFunctions } from '@h-ai/feedback'
|
|
95
|
+
* async function submit(service: FeedbackFunctions, context: FeedbackContext) {
|
|
96
|
+
* const result = await service.submit({ appId: 'orders', submissionId: 'stable-operation-id' }, context)
|
|
97
|
+
* return result.success ? result.data.id : result.error.code
|
|
98
|
+
* }
|
|
99
|
+
* void submit
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
interface FeedbackFunctions {
|
|
103
|
+
init: (config: FeedbackConfigInput) => Promise<HaiResult<void>>;
|
|
104
|
+
close: () => Promise<HaiResult<void>>;
|
|
105
|
+
readonly isInitialized: boolean;
|
|
106
|
+
readonly config: FeedbackConfig | null;
|
|
107
|
+
submit: (input: FeedbackSubmitInput, context: FeedbackContext) => Promise<HaiResult<FeedbackReport>>;
|
|
108
|
+
list: (input: FeedbackListInput, context: FeedbackContext) => Promise<HaiResult<PaginatedResult<FeedbackReport>>>;
|
|
109
|
+
get: (id: string, context: FeedbackContext) => Promise<HaiResult<FeedbackDetail>>;
|
|
110
|
+
getEvidence: (input: FeedbackEvidenceQuery, context: FeedbackContext) => Promise<HaiResult<PaginatedResult<FeedbackEvidence>>>;
|
|
111
|
+
setStatus: (input: FeedbackSetStatusInput, context: FeedbackContext) => Promise<HaiResult<FeedbackReport>>;
|
|
112
|
+
appendEvidence: (input: FeedbackAppendEvidenceInput, context: FeedbackContext) => Promise<HaiResult<{
|
|
113
|
+
acknowledged: string[];
|
|
114
|
+
evidenceRevision: number;
|
|
115
|
+
}>>;
|
|
116
|
+
completeCollection: (input: FeedbackCompleteInput, context: FeedbackContext) => Promise<HaiResult<FeedbackReport>>;
|
|
117
|
+
uploadAttachment: (input: FeedbackUploadInput, context: FeedbackContext) => Promise<HaiResult<FeedbackAttachment>>;
|
|
118
|
+
getAttachment: (input: {
|
|
119
|
+
id: string;
|
|
120
|
+
attachmentId: string;
|
|
121
|
+
}, context: FeedbackContext) => Promise<HaiResult<FeedbackAttachmentData>>;
|
|
122
|
+
retry: (input: FeedbackRetryInput, context: FeedbackContext) => Promise<HaiResult<void>>;
|
|
123
|
+
export: (input: FeedbackExportInput, context: FeedbackContext) => Promise<HaiResult<FeedbackJob>>;
|
|
124
|
+
getExport: (input: {
|
|
125
|
+
id: string;
|
|
126
|
+
jobId: string;
|
|
127
|
+
}, context: FeedbackContext) => Promise<HaiResult<FeedbackAttachmentData>>;
|
|
128
|
+
runJobs: () => Promise<HaiResult<{
|
|
129
|
+
processed: number;
|
|
130
|
+
}>>;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Feedback 生命周期与公共操作入口;依赖由应用初始化并在 feedback 关闭后释放。
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* import { feedback } from '@h-ai/feedback'
|
|
138
|
+
*
|
|
139
|
+
* // 宿主先初始化 reldb、storage、reach,并在反馈关闭后释放依赖。
|
|
140
|
+
* async function collectFeedback() {
|
|
141
|
+
* const initialized = await feedback.init({ appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' })
|
|
142
|
+
* if (!initialized.success) return initialized
|
|
143
|
+
* try {
|
|
144
|
+
* return await feedback.submit({ appId: 'orders', submissionId: 'stable-submission' }, { scopeId: 'tenant-1', userId: 'user-1' })
|
|
145
|
+
* } finally {
|
|
146
|
+
* await feedback.close()
|
|
147
|
+
* }
|
|
148
|
+
* }
|
|
149
|
+
* void collectFeedback
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
declare const feedback: FeedbackFunctions;
|
|
153
|
+
|
|
154
|
+
export { type FeedbackConfig, type FeedbackConfigInput, FeedbackConfigSchema, type FeedbackContext, type FeedbackFunctions, HaiFeedbackError, feedback };
|