@h-ai/feedback 0.1.0-alpha.76 → 1.0.0-beta.10
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 +3 -1
- package/README.ja.md +3 -1
- package/README.md +3 -1
- package/dist/client/index.js +39 -6
- package/dist/client/index.js.map +1 -1
- package/package.json +7 -7
package/README.en.md
CHANGED
|
@@ -72,7 +72,9 @@ Ordinary routes retain `transport.maxPlaintextBytes` (auto/omitted: 1 MiB). Decl
|
|
|
72
72
|
|
|
73
73
|
`keyScreenshots` defaults to false; automatic key screenshots require opt-in, while manual `prepare()` can still capture. Timeouts propagate AbortSignal and actual unfinished rendering retains the single-flight lock. The default renderer caps DOM traversal at 10000 nodes alongside its canvas pixel budget. With `replay:true`, `replayStart` defaults to `prepare`; pre-recording requires explicit `replayStart: init`. Call `pause()` when closing feedback to stop DOM replay/screenshots while retaining lightweight logs, drafts and uploads. Identity exit still calls `close({ discard:true })`. Custom `captureScreenshot({ signal })` should honor cancellation.
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
After acceptance, the SDK uploads attachments and subsequent evidence in the background. Network, 5xx, 408 and 429 failures retry after 1, 2, 4, 8 and 16 seconds, then pause after six consecutive failures. Other 4xx responses pause immediately. Drafts and attachments remain available; call `flush()` or prepare feedback again after connectivity or authentication recovers. Unsubmitted drafts and completed collections do not generate background uploads. `close({ discard: true })` waits for requests already in flight and starts no further requests for the old draft. Await it before initializing another identity.
|
|
76
|
+
|
|
77
|
+
Automatic screenshots use html2canvas to render a redacted DOM clone. Cross-origin images, iframe/video content and network fonts that are not ready may be missing. Browser or CSP failures are recorded as missing, and users can still attach images manually.
|
|
76
78
|
|
|
77
79
|
### Feedback capture and delivery checks
|
|
78
80
|
|
package/README.ja.md
CHANGED
|
@@ -72,7 +72,9 @@ return submitted
|
|
|
72
72
|
|
|
73
73
|
`keyScreenshots` の既定値は false で、自動撮影は明示的に有効化します。手動 `prepare()` は撮影可能です。タイムアウトは AbortSignal を伝え、実処理の終了まで重複撮影を禁止します。既定レンダラーは10000 DOMノードとキャンバス画素予算を制限します。`replay:true` の `replayStart` は既定 `prepare` です。事前記録には `replayStart: init` を明示します。画面を閉じる際の `pause()` はDOM記録と撮影を止め、軽量ログ・下書き・アップロードを維持します。ユーザー切替時は引き続き `close({ discard:true })` を呼び、独自撮影関数は `{ signal }` を尊重します。
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
受理後、SDK は添付ファイルと後続の証拠をバックグラウンド送信します。通信障害、5xx、408、429 は 1、2、4、8、16 秒後に再試行し、連続六回の失敗で停止します。それ以外の 4xx は直ちに停止します。下書きと添付ファイルを保持するため、接続や認証を復旧してから `flush()` または再度の準備操作で再試行できます。未送信の下書きと収集完了後はバックグラウンド送信しません。`close({ discard: true })` は開始済みの要求を待ち、旧下書きの後続要求を開始しません。終了を待ってから次のユーザーを初期化してください。
|
|
76
|
+
|
|
77
|
+
自動撮影は html2canvas で機密部分を隠したクローン DOM を描画します。クロスオリジン画像、iframe/video、未準備のネットワークフォントは欠落する場合があります。ブラウザーや CSP 制限による失敗は missing として記録され、画像の手動添付も利用できます。
|
|
76
78
|
|
|
77
79
|
### フィードバック収集と配布確認
|
|
78
80
|
|
package/README.md
CHANGED
|
@@ -74,7 +74,9 @@ return submitted
|
|
|
74
74
|
|
|
75
75
|
`keyScreenshots` 默认 false,需显式开启自动关键截图;手动 `prepare()` 仍可截图。截图超时会传递 AbortSignal,底层尚未结束时不允许重叠截图。默认渲染最多 10000 DOM 节点,继续受画布像素预算限制。`replay:true` 的默认 `replayStart` 为 `prepare`,打开反馈时才录制;明确需要预录时配置 `replayStart: init`。关闭反馈界面调用 `pause()` 停止 DOM 回放和截图,保留轻量日志、草稿及上传;退出身份仍调用 `close({ discard:true })`。自定义 `captureScreenshot({ signal })` 应尊重取消信号。
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
反馈受理后,SDK 后台补传附件和后续证据。网络、5xx、408 或 429 失败按 1、2、4、8、16 秒重试,连续六次失败后暂停;其他 4xx 立即暂停。草稿和附件保持不变,修复网络或重新认证后,通过 `flush()` 或再次准备反馈显式重试。未提交反馈、采集已完成时不发起后台补传。`close({ discard: true })` 等待已开始的请求结束,不再发起旧草稿的后续请求;宿主必须等待关闭完成再初始化下一身份。
|
|
78
|
+
|
|
79
|
+
自动截图使用 html2canvas 渲染经遮挡的克隆 DOM。跨域图片、iframe、video 和尚未就绪的网络字体可能缺失;浏览器或 CSP 限制导致失败时明确标记 missing,用户仍可手动添加附件。
|
|
78
80
|
|
|
79
81
|
`saveDraft(input?)` 统一本地导出与保存:Web 下载、Tauri 原生保存对话框、Capacitor 缓存文件原生分享。取消返回 `status: 'cancelled'`;错误仍返回失败。原生插件为可选 peer,生成 App/Desktop 已配置依赖与 Tauri 权限;自定义宿主需安装对应插件。`createFeedbackReview(typedClient.feedback.reports)` 提供 `loadReplay(id)` 与可取消的 `exportReport(id)`,不再由应用分页和轮询。退出身份调用 `review.close()` 与 `client.close({ discard: true })`,停止采集、轮询,清理预览和持久草稿。
|
|
80
82
|
|
package/dist/client/index.js
CHANGED
|
@@ -401,6 +401,8 @@ function createFeedbackClient() {
|
|
|
401
401
|
let initialIds = /* @__PURE__ */ new Set();
|
|
402
402
|
const uploadedIds = /* @__PURE__ */ new Set();
|
|
403
403
|
let flushPromise;
|
|
404
|
+
let flushFailures = 0;
|
|
405
|
+
let nextBackgroundFlush = 0;
|
|
404
406
|
let preparePromise;
|
|
405
407
|
let persistTimer;
|
|
406
408
|
let flushTimer;
|
|
@@ -625,8 +627,8 @@ function createFeedbackClient() {
|
|
|
625
627
|
stopReplay?.();
|
|
626
628
|
stopReplay = void 0;
|
|
627
629
|
}
|
|
628
|
-
if (draft?.report)
|
|
629
|
-
void
|
|
630
|
+
if (draft?.report && !collectionFinished && Date.now() >= nextBackgroundFlush)
|
|
631
|
+
void runFlush();
|
|
630
632
|
}, 1e3);
|
|
631
633
|
return ok(void 0);
|
|
632
634
|
} catch (cause) {
|
|
@@ -744,6 +746,13 @@ function createFeedbackClient() {
|
|
|
744
746
|
if (!config || closing)
|
|
745
747
|
return failure("NOT_INITIALIZED");
|
|
746
748
|
const activeConfig = config;
|
|
749
|
+
if (flushPromise) {
|
|
750
|
+
const pending = await flushPromise;
|
|
751
|
+
if (!pending.success)
|
|
752
|
+
return pending;
|
|
753
|
+
if (closing || config !== activeConfig)
|
|
754
|
+
return failure("NOT_INITIALIZED");
|
|
755
|
+
}
|
|
747
756
|
if (draft?.report && !collectionFinished) {
|
|
748
757
|
if (Date.now() < deadline && afterCount < limits().after)
|
|
749
758
|
draft.missing.push("collection-ended-by-new-feedback");
|
|
@@ -927,7 +936,7 @@ function createFeedbackClient() {
|
|
|
927
936
|
current.report = result.data;
|
|
928
937
|
initialIds = new Set(current.submission.evidence?.map((item) => item.id));
|
|
929
938
|
schedulePersist();
|
|
930
|
-
void
|
|
939
|
+
void runFlush();
|
|
931
940
|
return result;
|
|
932
941
|
} catch (cause) {
|
|
933
942
|
return failure("OPERATION_FAILED", cause);
|
|
@@ -940,6 +949,8 @@ function createFeedbackClient() {
|
|
|
940
949
|
return ok(void 0);
|
|
941
950
|
try {
|
|
942
951
|
for (const item of draft.attachments) {
|
|
952
|
+
if (discardOnClose)
|
|
953
|
+
return ok(void 0);
|
|
943
954
|
if (uploadedIds.has(item.id))
|
|
944
955
|
continue;
|
|
945
956
|
const result = await config.actions.upload({ id: draft.report.id, attachmentId: item.id, dataBase64: base64(item.bytes) });
|
|
@@ -949,6 +960,8 @@ function createFeedbackClient() {
|
|
|
949
960
|
}
|
|
950
961
|
let drainPasses = 0;
|
|
951
962
|
while (true) {
|
|
963
|
+
if (discardOnClose)
|
|
964
|
+
return ok(void 0);
|
|
952
965
|
if (closing || Date.now() >= deadline || afterCount >= limits().after)
|
|
953
966
|
collectionSealed = true;
|
|
954
967
|
const pending = draft.evidence.filter((item) => !initialIds.has(item.id)).slice(0, 200);
|
|
@@ -965,7 +978,7 @@ function createFeedbackClient() {
|
|
|
965
978
|
if (drainPasses >= budget.maxAttachmentCount)
|
|
966
979
|
return ok(void 0);
|
|
967
980
|
}
|
|
968
|
-
if (collectionSealed) {
|
|
981
|
+
if (collectionSealed && !discardOnClose) {
|
|
969
982
|
const result = await config.actions.completeCollection({ id: draft.report.id, missing: [.../* @__PURE__ */ new Set([...draft.missing, ...missing])] });
|
|
970
983
|
if (!result.success)
|
|
971
984
|
return result;
|
|
@@ -985,7 +998,23 @@ function createFeedbackClient() {
|
|
|
985
998
|
}
|
|
986
999
|
}
|
|
987
1000
|
function flush() {
|
|
988
|
-
|
|
1001
|
+
flushFailures = 0;
|
|
1002
|
+
nextBackgroundFlush = 0;
|
|
1003
|
+
return runFlush();
|
|
1004
|
+
}
|
|
1005
|
+
function runFlush() {
|
|
1006
|
+
flushPromise ??= doFlush().then((result) => {
|
|
1007
|
+
if (result.success) {
|
|
1008
|
+
flushFailures = 0;
|
|
1009
|
+
nextBackgroundFlush = 0;
|
|
1010
|
+
} else {
|
|
1011
|
+
flushFailures++;
|
|
1012
|
+
const status = result.error.httpStatus;
|
|
1013
|
+
const rejected = status !== void 0 && status >= 400 && status < 500 && status !== 408 && status !== 429;
|
|
1014
|
+
nextBackgroundFlush = rejected || flushFailures >= 6 ? Number.POSITIVE_INFINITY : Date.now() + 1e3 * 2 ** (flushFailures - 1);
|
|
1015
|
+
}
|
|
1016
|
+
return result;
|
|
1017
|
+
}).finally(() => {
|
|
989
1018
|
flushPromise = void 0;
|
|
990
1019
|
});
|
|
991
1020
|
return flushPromise;
|
|
@@ -1125,7 +1154,9 @@ function createFeedbackClient() {
|
|
|
1125
1154
|
persistTimer = void 0;
|
|
1126
1155
|
await preparePromise;
|
|
1127
1156
|
await keyScreenshotPromise;
|
|
1128
|
-
if (
|
|
1157
|
+
if (discardOnClose)
|
|
1158
|
+
await flushPromise;
|
|
1159
|
+
else if (draft?.report)
|
|
1129
1160
|
await flush();
|
|
1130
1161
|
if (discardOnClose && storageKey)
|
|
1131
1162
|
await deleteFeedbackDraft(storageKey).catch(() => void 0);
|
|
@@ -1150,6 +1181,8 @@ function createFeedbackClient() {
|
|
|
1150
1181
|
dropped = 0;
|
|
1151
1182
|
collectionFinished = false;
|
|
1152
1183
|
collectionSealed = false;
|
|
1184
|
+
flushFailures = 0;
|
|
1185
|
+
nextBackgroundFlush = 0;
|
|
1153
1186
|
}
|
|
1154
1187
|
return { init, prepare, pause, captureScreenshot, submit, flush, record, getDraft: () => draft, getView, releasePreviews, annotate, addFiles, exportDraft, async saveDraft(input) {
|
|
1155
1188
|
const session = config;
|
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 * @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"]}
|
|
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 flushFailures = 0\n let nextBackgroundFlush = 0\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 && !collectionFinished && Date.now() >= nextBackgroundFlush)\n void runFlush()\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 // 先等上一轮补传退出,再收口本次窗口,避免复用收口前已完成的 Promise。\n if (flushPromise) {\n const pending = await flushPromise\n if (!pending.success)\n return pending\n if (closing || config !== activeConfig)\n return failure('NOT_INITIALIZED')\n }\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 runFlush()\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 (discardOnClose)\n return ok(undefined)\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 (discardOnClose)\n return ok(undefined)\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 && !discardOnClose) {\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 // 用户重新打开/显式重试时恢复补传;沿用同一提交和附件 ID。\n flushFailures = 0\n nextBackgroundFlush = 0\n return runFlush()\n }\n\n function runFlush(): Promise<HaiResult<void>> {\n flushPromise ??= doFlush().then((result) => {\n if (result.success) {\n flushFailures = 0\n nextBackgroundFlush = 0\n }\n else {\n flushFailures++\n const status = result.error.httpStatus\n // 权限/输入/资源拒绝等待用户处理;临时故障最多再试五次,避免闲置页面持续刷错。\n const rejected = status !== undefined && status >= 400 && status < 500 && status !== 408 && status !== 429\n nextBackgroundFlush = rejected || flushFailures >= 6 ? Number.POSITIVE_INFINITY : Date.now() + 1000 * 2 ** (flushFailures - 1)\n }\n return result\n }).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 // 身份退出只等待已经开始的请求,不使用新身份凭据补传旧草稿。\n if (discardOnClose)\n await flushPromise\n else 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 flushFailures = 0\n nextBackgroundFlush = 0\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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/feedback",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "1.0.0-beta.10",
|
|
5
5
|
"description": "Hai Framework feedback collection, evidence, notifications and offline diagnostic bundles.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"exports": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"@capacitor/filesystem": "^8.1.5",
|
|
42
42
|
"@capacitor/share": "^8.0.3",
|
|
43
|
-
"@h-ai/reach": "
|
|
43
|
+
"@h-ai/reach": "1.0.0-beta.10",
|
|
44
44
|
"@tauri-apps/plugin-dialog": "^2.8.3",
|
|
45
45
|
"@tauri-apps/plugin-fs": "^2.7.1"
|
|
46
46
|
},
|
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@h-ai/api-contract": "
|
|
66
|
-
"@h-ai/core": "
|
|
67
|
-
"@h-ai/reldb": "
|
|
68
|
-
"@h-ai/storage": "
|
|
65
|
+
"@h-ai/api-contract": "1.0.0-beta.10",
|
|
66
|
+
"@h-ai/core": "1.0.0-beta.10",
|
|
67
|
+
"@h-ai/reldb": "1.0.0-beta.10",
|
|
68
|
+
"@h-ai/storage": "1.0.0-beta.10",
|
|
69
69
|
"@rrweb/record": "^2.1.7",
|
|
70
70
|
"@rrweb/replay": "^2.1.7",
|
|
71
71
|
"fflate": "^0.8.3",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"@capacitor/filesystem": "^8.1.5",
|
|
77
77
|
"@capacitor/share": "^8.0.3",
|
|
78
|
-
"@h-ai/reach": "
|
|
78
|
+
"@h-ai/reach": "1.0.0-beta.10",
|
|
79
79
|
"@tauri-apps/plugin-dialog": "^2.8.3",
|
|
80
80
|
"@tauri-apps/plugin-fs": "^2.7.1",
|
|
81
81
|
"@types/node": "^26.6.5",
|