@h-ai/feedback 0.1.0-alpha.73 → 0.1.0-alpha.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +60 -3
- package/README.ja.md +60 -3
- package/README.md +60 -3
- package/dist/{chunk-PYKGS35A.js → chunk-UIVT267C.js} +5 -5
- package/dist/chunk-UIVT267C.js.map +1 -0
- package/dist/client/index.js +8 -3
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +76 -3
- package/dist/index.js +206 -20
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/dist/chunk-PYKGS35A.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/feedback-config.ts","../src/feedback-repository.ts","../src/feedback-sanitize.ts","../src/feedback-capture.ts","../src/feedback-clock.ts","../src/feedback-functions.ts","../src/feedback-main.ts"],"names":["core","current","reldb","key","missing","err","createHash","ok","FeedbackEvidenceInputSchema","bytes","Buffer","randomUUID","updated","cleared","unavailable","stored","removed","storage","provider","resolveFeedbackBudget"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod'\n\n/**\n * Feedback 服务端配置,不包含依赖模块凭据;连接由宿主初始化。\n * @example\n * ```ts\n * import { FeedbackConfigSchema } from '@h-ai/feedback'\n * const config = FeedbackConfigSchema.parse({ appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' })\n * void config.retentionDays\n * ```\n */\nexport const FeedbackConfigSchema = z.strictObject({\n /** 反馈所属应用标识;应与浏览器及 API 入口配置一致。 */\n appId: z.string().min(1).max(128),\n /** 当前应用版本,作为默认诊断信息保存。 */\n appVersion: z.string().max(128).optional(),\n /** 构建标识,帮助定位发布产物。 */\n buildId: z.string().max(128).optional(),\n /** 源码提交标识,帮助定位对应代码。 */\n commit: z.string().max(128).optional(),\n /** disabled 不通知,console 输出安全摘要,reach 使用已有通知通道。 */\n notificationMode: z.enum(['disabled', 'console', 'reach']).default('reach'),\n /** Reach 接收方,由实际 Provider 校验邮箱、手机号或业务目的地。 */\n recipients: z.array(z.string().min(1).max(320)).max(20).default([]),\n /** 已初始化 Reach Provider 的唯一名称,不限制为邮件。 */\n notificationProvider: z.string().min(1).default('email'),\n /** 管理员通知中的反馈管理页面地址。 */\n adminUrl: z.url().refine(value => ['http:', 'https:'].includes(new URL(value).protocol)).optional(),\n /** 补充材料收集超时,单位毫秒;超时后冻结为完整或部分材料。 */\n collectionTimeoutMs: z.number().int().min(0).max(300000).default(60000),\n /** 持久任务扫描间隔,单位毫秒;零值由宿主手动运行任务。 */\n workerIntervalMs: z.number().int().min(0).max(60000).default(1000),\n /** 持久任务执行租约时长,单位毫秒;过期后允许其他实例接管。 */\n leaseMs: z.number().int().min(1000).max(300000).default(30000),\n /** 汇集、通知和导出任务最大尝试次数;到期清理持续重试。 */\n maxAttempts: z.number().int().min(1).max(20).default(5),\n /** 已受理反馈及对象附件的保留天数。 */\n retentionDays: z.number().int().min(1).max(3650).default(30),\n /** 允许采集的服务端环境变量名;凭据类名称仍按敏感信息策略排除。 */\n envAllowlist: z.array(z.string().min(1).max(128)).max(100).default([]),\n /** 未压缩导出总预算;客户端、附件总量和传输预算由此派生。 */\n maxTotalBytes: z.number().int().min(4 * 1024 * 1024).max(40 * 1024 * 1024).default(32 * 1024 * 1024),\n /** 单个附件允许的最大字节数;同时受总预算约束。 */\n maxAttachmentBytes: z.number().int().min(1).max(5 * 1024 * 1024).default(5 * 1024 * 1024),\n /** 单份反馈累计证据允许的最大字节数。 */\n maxEvidenceBytes: z.number().int().min(1024).max(4 * 1024 * 1024).default(4 * 1024 * 1024),\n /** 单份反馈累计证据允许的最大条数。 */\n maxEvidenceCount: z.number().int().min(1).max(10000).default(2000),\n}).superRefine((config, context) => {\n if (config.notificationMode === 'reach' && !config.recipients.length)\n context.addIssue({ code: 'custom', path: ['recipients'], message: 'Reach recipients are required' })\n})\n\n/**\n * 已校验服务端配置,默认项均已补齐。\n * @example\n * ```ts\n * import type { FeedbackConfig } from '@h-ai/feedback'\n * function describeRetention(config: FeedbackConfig) { return `${config.appId}: ${config.retentionDays} days` }\n * void describeRetention\n * ```\n */\nexport type FeedbackConfig = z.infer<typeof FeedbackConfigSchema>\n/**\n * 服务端输入配置,默认项可省略。\n * @example\n * ```ts\n * import type { FeedbackConfigInput } from '@h-ai/feedback'\n * const config: FeedbackConfigInput = { appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' }\n * void config\n * ```\n */\nexport type FeedbackConfigInput = z.input<typeof FeedbackConfigSchema>\n","import type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, DmlWithTxOperations, ReldbTableDef } from '@h-ai/reldb'\nimport { FeedbackReportSchema } from '@h-ai/api-contract/feedback'\nimport { err, ok } from '@h-ai/core'\nimport { BaseReldbCrudRepository, reldb } from '@h-ai/reldb'\nimport { feedbackM } from './feedback-i18n.js'\nimport { HaiFeedbackError } from './feedback-types.js'\n\n// 表与列只能来自本模块静态定义,所有动态值均使用参数绑定。\nconst REPORTS = 'hai_feedback_reports'\nconst EVIDENCE = 'hai_feedback_evidence'\nconst ATTACHMENTS = 'hai_feedback_attachments'\nconst HISTORY = 'hai_feedback_history'\nconst JOBS = 'hai_feedback_jobs'\n\n// 仅允许本模块静态身份列;不能把外部输入拼成 SQL 标识符。\nconst identityColumns = ['id', 'report_id', 'scope_id', 'app_id', 'user_id', 'source', 'request_id', 'error_id', 'client_id'] as const\n\n/**\n * 内部身份等值条件:保留索引预筛,并在 MySQL 中排除 CI/PAD SPACE 排序规则的别名。\n * 参数在生成占位符时一并追加,避免方言差异导致绑定错位。\n * @example 模块内部上下文\n * ```ts\n * const params: unknown[] = []\n * const condition = feedbackTextEquals('scope_id', 'tenant-A', params)\n * void condition\n * ```\n */\nexport function feedbackTextEquals(column: typeof identityColumns[number], value: string, params: unknown[]): string {\n if (!identityColumns.includes(column))\n throw new Error('Invalid feedback identity column')\n params.push(value)\n if (reldb.config?.type !== 'mysql')\n return `${column} = ?`\n params.push(value)\n return `(${column} = ? AND CAST(${column} AS BINARY) = CAST(? AS BINARY))`\n}\n\nconst reportDef: ReldbTableDef = {\n id: { type: 'TEXT', primaryKey: true },\n scope_id: { type: 'TEXT', notNull: true },\n user_id: { type: 'TEXT', notNull: true },\n app_id: { type: 'TEXT', notNull: true },\n number: { type: 'TEXT', notNull: true },\n app_version: { type: 'TEXT' },\n summary: { type: 'TEXT', notNull: true },\n submission_key: { type: 'TEXT', notNull: true, unique: true },\n submission_hash: { type: 'TEXT', notNull: true },\n status: { type: 'TEXT', notNull: true },\n collection_status: { type: 'TEXT', notNull: true },\n notification_status: { type: 'TEXT', notNull: true },\n created_at: { type: 'BIGINT', notNull: true },\n updated_at: { type: 'BIGINT', notNull: true },\n version: { type: 'INTEGER', notNull: true },\n revision: { type: 'INTEGER', notNull: true },\n evidence_count: { type: 'INTEGER', notNull: true },\n evidence_bytes: { type: 'BIGINT', notNull: true },\n collect_deadline: { type: 'BIGINT', notNull: true },\n expires_at: { type: 'BIGINT', notNull: true },\n payload: { type: 'JSON', notNull: true },\n deleting: { type: 'INTEGER', notNull: true },\n}\n\n/**\n * 内部持久记录;payload 使用 JSON 以容纳跨数据库的长描述。\n * @example 模块内部上下文\n * ```ts\n * function reportIdentity(row: FeedbackReportRow) { return { id: row.id, scopeId: row.scope_id } }\n * void reportIdentity\n * ```\n */\nexport interface FeedbackReportRow {\n id: string\n scope_id: string\n user_id: string\n app_id: string\n number: string\n app_version: string | null\n summary: string\n submission_key: string\n submission_hash: string\n status: string\n collection_status: string\n notification_status: string\n created_at: number\n updated_at: number\n version: number\n revision: number\n evidence_count: number\n evidence_bytes: number\n collect_deadline: number\n expires_at: number\n payload: unknown\n deleting: number\n}\n\n/**\n * 内部任务行;租约与正文不通过公开 API 泄漏。\n * @example 模块内部上下文\n * ```ts\n * function ownedJob(row: FeedbackJobRow, token: string) { return row.status === 'running' && row.token === token }\n * void ownedJob\n * ```\n */\nexport interface FeedbackJobRow {\n id: string\n app_id: string\n snapshot_revision: number | null\n snapshot_version: number | null\n report_id: string\n scope_id: string\n kind: 'collect' | 'notify' | 'export' | 'cleanup'\n status: 'pending' | 'running' | 'succeeded' | 'failed'\n token: string | null\n lease_until: number\n attempts: number\n next_run_at: number\n created_at: number\n updated_at: number\n last_error: string | null\n payload: unknown\n result: unknown\n}\n\n/**\n * 内部证据行,单条结构化事件保持可分页/按请求定位。\n * @example 模块内部上下文\n * ```ts\n * function eventPosition(row: FeedbackEvidenceRow) { return `${row.source}:${row.sequence}` }\n * void eventPosition\n * ```\n */\nexport interface FeedbackEvidenceRow {\n id: string\n report_id: string | null\n scope_id: string\n user_id: string\n app_id: string\n source: string\n sequence: number\n kind: string\n timestamp: number\n request_id: string | null\n error_id: string | null\n revision: number\n bytes: number\n expires_at: number\n payload: unknown\n}\n\n/**\n * 内部附件行,客户端永远不能指定 object_key。\n * @example 模块内部上下文\n * ```ts\n * function availableObject(row: FeedbackAttachmentRow) { return row.status === 'available' ? row.object_key : null }\n * void availableObject\n * ```\n */\nexport interface FeedbackAttachmentRow {\n id: string\n client_id: string\n report_id: string\n scope_id: string\n object_key: string\n status: 'pending' | 'available' | 'failed'\n size: number\n checksum: string\n updated_at: number\n payload: unknown\n}\n\n/**\n * 数据库返回 JSON 在各驱动间可能为文本或对象,集中归一化。\n * @example 模块内部上下文\n * ```ts\n * const decoded = readFeedbackJson('{\"status\":\"pending\"}')\n * void decoded\n * ```\n */\nexport function readFeedbackJson(value: unknown): unknown {\n return typeof value === 'string' ? JSON.parse(value) : value\n}\n\n/**\n * 内部仓库,沿用框架建表屏障;SQL 只用于跨实体事务和条件提交。\n * @example 模块内部上下文\n * ```ts\n * async function findReport(id: string, scopeId: string) {\n * const repository = new FeedbackReportRepository()\n * const ready = await repository.ready()\n * return ready.success ? repository.find(id, scopeId) : ready\n * }\n * void findReport\n * ```\n */\nexport class FeedbackReportRepository extends BaseReldbCrudRepository<FeedbackReportRow> {\n readonly tables = { reports: REPORTS, evidence: EVIDENCE, attachments: ATTACHMENTS, history: HISTORY, jobs: JOBS }\n\n constructor() {\n super(reldb, {\n table: REPORTS,\n fields: Object.entries(reportDef).map(([name, def]) => ({ fieldName: name, columnName: name, def, select: true, create: true, update: name !== 'id' })),\n })\n }\n\n async ready(): Promise<HaiResult<void>> {\n const report = await this.ensureReady()\n if (!report.success)\n return report\n const definitions: Array<[string, ReldbTableDef]> = [\n [EVIDENCE, {\n id: { type: 'TEXT', primaryKey: true },\n report_id: { type: 'TEXT' },\n scope_id: { type: 'TEXT', notNull: true },\n user_id: { type: 'TEXT', notNull: true },\n app_id: { type: 'TEXT', notNull: true },\n source: { type: 'TEXT', notNull: true },\n sequence: { type: 'BIGINT', notNull: true },\n kind: { type: 'TEXT', notNull: true },\n timestamp: { type: 'BIGINT', notNull: true },\n request_id: { type: 'TEXT' },\n error_id: { type: 'TEXT' },\n revision: { type: 'INTEGER', notNull: true },\n bytes: { type: 'INTEGER', notNull: true },\n expires_at: { type: 'BIGINT', notNull: true },\n payload: { type: 'JSON', notNull: true },\n }],\n [ATTACHMENTS, {\n id: { type: 'TEXT', primaryKey: true },\n client_id: { type: 'TEXT', notNull: true },\n report_id: { type: 'TEXT', notNull: true },\n scope_id: { type: 'TEXT', notNull: true },\n object_key: { type: 'TEXT', notNull: true },\n status: { type: 'TEXT', notNull: true },\n size: { type: 'BIGINT', notNull: true },\n checksum: { type: 'TEXT', notNull: true },\n updated_at: { type: 'BIGINT', notNull: true },\n payload: { type: 'JSON', notNull: true },\n }],\n [HISTORY, { id: { type: 'TEXT', primaryKey: true }, report_id: { type: 'TEXT', notNull: true }, payload: { type: 'JSON', notNull: true } }],\n [JOBS, {\n id: { type: 'TEXT', primaryKey: true },\n app_id: { type: 'TEXT', notNull: true },\n snapshot_revision: { type: 'INTEGER' },\n snapshot_version: { type: 'INTEGER' },\n report_id: { type: 'TEXT', notNull: true },\n scope_id: { type: 'TEXT', notNull: true },\n kind: { type: 'TEXT', notNull: true },\n status: { type: 'TEXT', notNull: true },\n token: { type: 'TEXT' },\n lease_until: { type: 'BIGINT', notNull: true },\n attempts: { type: 'INTEGER', notNull: true },\n next_run_at: { type: 'BIGINT', notNull: true },\n created_at: { type: 'BIGINT', notNull: true },\n updated_at: { type: 'BIGINT', notNull: true },\n last_error: { type: 'TEXT' },\n payload: { type: 'JSON', notNull: true },\n result: { type: 'JSON' },\n }],\n ]\n for (const [table, definition] of definitions) {\n const created = await reldb.ddl.createTable(table, definition)\n if (!created.success)\n return created\n }\n const indexes = [\n { table: REPORTS, name: 'hai_feedback_reports_scope_time', columns: ['scope_id', 'created_at'] },\n { table: REPORTS, name: 'hai_feedback_reports_scope_status', columns: ['scope_id', 'status', 'created_at'] },\n { table: EVIDENCE, name: 'hai_feedback_evidence_report_seq', columns: ['report_id', 'source', 'sequence'] },\n { table: EVIDENCE, name: 'hai_feedback_evidence_temp_scope', columns: ['scope_id', 'user_id', 'timestamp'] },\n { table: ATTACHMENTS, name: 'hai_feedback_attachments_report', columns: ['report_id'] },\n { table: HISTORY, name: 'hai_feedback_history_report', columns: ['report_id'] },\n { table: JOBS, name: 'hai_feedback_jobs_pending', columns: ['app_id', 'status', 'next_run_at'] },\n { table: JOBS, name: 'hai_feedback_jobs_snapshot', columns: ['report_id', 'snapshot_revision', 'snapshot_version'] },\n ]\n for (const index of indexes) {\n // MySQL 的 CREATE INDEX 不支持 IF NOT EXISTS;重启和多节点启动须核验真实索引定义。\n const inspect = async (): Promise<HaiResult<boolean>> => {\n const found = await reldb.sql.query<{ column_name: string, non_unique: number }>('SELECT COLUMN_NAME AS column_name, NON_UNIQUE AS non_unique FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ? ORDER BY SEQ_IN_INDEX', [index.table, index.name])\n if (!found.success)\n return found\n if (!found.data.length)\n return ok(false)\n const matches = found.data.length === index.columns.length && found.data.every((column, position) => column.column_name === index.columns[position] && Number(column.non_unique) === 1)\n return matches ? ok(true) : err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n }\n if (reldb.config?.type === 'mysql') {\n const existing = await inspect()\n if (!existing.success)\n return existing\n if (existing.data)\n continue\n }\n const result = await reldb.ddl.createIndex(index.table, index.name, { columns: index.columns })\n if (!result.success) {\n // 两个进程可能同时观察到缺失;仅另一进程已建立完全一致的索引才视为完成。\n if (reldb.config?.type === 'mysql') {\n const concurrent = await inspect()\n if (concurrent.success && concurrent.data)\n continue\n }\n return result\n }\n }\n return ok(undefined)\n }\n\n async find(id: string, scope: string, sql: DmlOperations = reldb.sql) {\n const lock = sql !== reldb.sql && reldb.config?.type !== 'sqlite' ? ' FOR UPDATE' : ''\n const params: unknown[] = []\n const condition = `${feedbackTextEquals('id', id, params)} AND ${feedbackTextEquals('scope_id', scope, params)}`\n const result = await sql.get<FeedbackReportRow>(`SELECT * FROM ${REPORTS} WHERE ${condition}${lock}`, params)\n return result.success && result.data && (result.data.id !== id || result.data.scope_id !== scope) ? ok(null) : result\n }\n\n report(row: FeedbackReportRow) {\n return FeedbackReportSchema.parse({\n ...FeedbackReportSchema.parse(readFeedbackJson(row.payload)),\n status: row.status,\n collectionStatus: row.collection_status,\n notificationStatus: row.notification_status,\n updatedAt: Number(row.updated_at),\n version: Number(row.version),\n evidenceRevision: Number(row.revision),\n })\n }\n\n /** 显式事务逐步检查 HaiResult;业务失败也执行 rollback。 */\n async transaction<T>(work: (tx: DmlWithTxOperations) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n const begun = await reldb.tx.begin()\n if (!begun.success)\n return begun\n try {\n const result = await work(begun.data)\n if (!result.success) {\n const rollback = await begun.data.rollback()\n return rollback.success ? result : rollback\n }\n const committed = await begun.data.commit()\n return committed.success ? result : committed\n }\n catch {\n await begun.data.rollback()\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n }\n }\n}\n","import { core } from '@h-ai/core'\nimport { redactFeedbackText } from './feedback-sanitize-text.js'\n\nexport { redactFeedbackText } from './feedback-sanitize-text.js'\n\n/**\n * JSON 安全拷贝,避免原对象被异步采集修改;各字符串同样执行凭证脱敏。\n * @example 模块内部上下文\n * ```ts\n * const evidence = sanitizeFeedbackValue({ message: 'failure', password: 'discard-me' })\n * void evidence\n * ```\n */\nexport function sanitizeFeedbackValue(value: unknown): unknown {\n const sanitized = core.sanitize.sanitizeSensitiveFields(value)\n return JSON.parse(JSON.stringify(sanitized, (_key, item: unknown) => {\n if (typeof item === 'bigint')\n return item.toString()\n if (typeof item === 'string') {\n if (/^https?:\\/\\//i.test(item))\n return core.sanitize.sanitizeUrl(item)\n return redactFeedbackText(item)\n }\n return item\n }))\n}\n\n/**\n * 稳定提交摘要:相同内容的字段顺序不影响幂等性。\n * @example 模块内部上下文\n * ```ts\n * const first = canonicalFeedbackJson({ b: 2, a: 1 })\n * const same = first === canonicalFeedbackJson({ a: 1, b: 2 })\n * void same\n * ```\n */\nexport function canonicalFeedbackJson(value: unknown): string {\n if (Array.isArray(value))\n return `[${value.map(canonicalFeedbackJson).join(',')}]`\n if (value && typeof value === 'object') {\n return `{${Object.entries(value).filter(([, item]) => item !== undefined).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonicalFeedbackJson(item)}`).join(',')}}`\n }\n return JSON.stringify(value) ?? 'null'\n}\n","import type { FeedbackEvidenceInput } from '@h-ai/api-contract/feedback'\nimport type { LogRecord } from '@h-ai/core'\nimport { Buffer } from 'node:buffer'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { arch, platform, release, totalmem } from 'node:os'\nimport process from 'node:process'\nimport { FeedbackEvidenceInputSchema } from '@h-ai/api-contract/feedback'\nimport { core } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { feedbackTextEquals, readFeedbackJson } from './feedback-repository.js'\nimport { sanitizeFeedbackValue } from './feedback-sanitize.js'\n\n/**\n * 绑定可信身份的内部日志副本,字节数用于有界缓存。\n * @example 模块内部上下文\n * ```ts\n * const record: CapturedRecord = { event: { id: 'entry', source: 'server:test', sequence: 1, kind: 'log', timestamp: 1, data: {} }, scopeId: 'tenant', userId: 'user', bytes: 1 }\n * void record.bytes\n * ```\n */\ninterface CapturedRecord { event: FeedbackEvidenceInput, scopeId: string, userId: string, bytes: number }\n\n/**\n * Node 现场观察器,只保留有可信身份上下文的有界日志。\n * @example 模块内部上下文\n * ```ts\n * function startAfterDependencies() {\n * const capture = createFeedbackCapture('orders', [], {})\n * return capture.close()\n * }\n * ```\n */\nexport function createFeedbackCapture(appId: string, envAllowlist: string[], service: { appVersion?: string, buildId?: string, commit?: string }) {\n const source = `server:${randomUUID()}`\n const buffer: CapturedRecord[] = []\n const pending = new Map<string, CapturedRecord>()\n const windows = new Map<string, { errorId: string, after: number, deadline: number }>()\n const losses = new Map<string, CapturedRecord>()\n let capacityLoss: FeedbackEvidenceInput | undefined\n let sequence = 0\n let totalBytes = 0\n let stopped = false\n let flushing: Promise<void> | null = null\n\n async function flush(): Promise<void> {\n if (flushing)\n return flushing\n flushing = core.context.run({ suppressLogObservers: true }, async () => {\n // 队列自身最多 3000 条日志和 200 条缺失标记;一次补采须排空当前快照。\n for (const [key, item] of [...pending]) {\n const current = await reldb.sql.get('SELECT id FROM hai_feedback_evidence WHERE id = ?', [key])\n if (!current.success) {\n rememberLoss(item, 'server_temporary_evidence_write_failed')\n return\n }\n if (!current.data) {\n const event = item.event\n const result = await reldb.sql.execute('INSERT INTO hai_feedback_evidence (id, report_id, scope_id, user_id, app_id, source, sequence, kind, timestamp, request_id, error_id, revision, bytes, expires_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [key, null, item.scopeId, item.userId, appId, event.source, event.sequence, event.kind, event.timestamp, event.requestId ?? null, event.errorId ?? null, 1, item.bytes, Date.now() + 5 * 60000, JSON.stringify(event)])\n if (!result.success) {\n rememberLoss(item, 'server_temporary_evidence_write_failed')\n return\n }\n }\n pending.delete(key)\n }\n }).finally(() => {\n flushing = null\n })\n return flushing\n }\n\n function rememberLoss(item: Pick<CapturedRecord, 'scopeId' | 'userId'> & { event?: FeedbackEvidenceInput, requestId?: string }, reason: string) {\n for (const [key, previous] of losses) {\n if (previous.event.timestamp < Date.now() - 5 * 60000) {\n losses.delete(key)\n pending.delete(createHash('sha256').update(`${source}:${previous.event.sequence}`).digest('hex'))\n }\n }\n if (capacityLoss && capacityLoss.timestamp < Date.now() - 5 * 60000)\n capacityLoss = undefined\n const requestId = item.requestId ?? item.event?.requestId\n const key = JSON.stringify([item.scopeId, item.userId, requestId, reason])\n if (losses.has(key))\n return\n const event: FeedbackEvidenceInput = { id: randomUUID(), source, sequence: sequence++, kind: 'missing', timestamp: Date.now(), requestId, data: { source: 'server_logs' }, missingReason: reason }\n if (losses.size >= 200) {\n // 元数据容量耗尽时保留一个不含身份信息的稳定降级标记。\n capacityLoss ??= { ...event, requestId: undefined, missingReason: 'server_capture_capacity_exceeded' }\n return\n }\n const entry = { event, scopeId: item.scopeId, userId: item.userId, bytes: Buffer.byteLength(JSON.stringify(event)) }\n losses.set(key, entry)\n pending.set(createHash('sha256').update(`${source}:${event.sequence}`).digest('hex'), entry)\n }\n\n function pin(item: CapturedRecord, errorId: string) {\n if (item.event.kind === 'error')\n item.event.errorId = item.event.id\n else item.event.errorId ??= errorId\n const key = createHash('sha256').update(`${source}:${item.event.sequence}`).digest('hex')\n if (pending.has(key))\n return\n if (pending.size >= 3000) {\n rememberLoss(item, 'server_pending_evidence_overflow')\n return\n }\n // 日志首次归属后不再改变 payload;重叠窗口复用同一条临时证据。\n const event = { ...item.event }\n pending.set(key, { ...item, event })\n }\n\n function observe(record: LogRecord) {\n if (stopped || record.context.module === 'feedback')\n return\n const { scopeId, userId, requestId } = record.context\n if (typeof scopeId !== 'string' || typeof userId !== 'string' || typeof requestId !== 'string')\n return\n const value = sanitizeFeedbackValue({ message: record.message, level: record.level, context: record.context })\n const event = FeedbackEvidenceInputSchema.parse({ id: randomUUID(), source, sequence: sequence++, kind: record.level === 'error' || record.level === 'fatal' ? 'error' : 'log', timestamp: record.timestamp, requestId, data: value })\n const bytes = Buffer.byteLength(JSON.stringify(event))\n if (bytes > 65536) {\n rememberLoss({ scopeId, userId, requestId }, 'server_log_record_too_large')\n return\n }\n const item = { event, scopeId, userId, bytes }\n const key = JSON.stringify([scopeId, userId, requestId])\n const previous = windows.get(key)\n if (previous) {\n if (previous.deadline >= Date.now() && previous.after < 100) {\n pin(item, previous.errorId)\n previous.after++\n }\n else {\n windows.delete(key)\n }\n }\n if (event.kind === 'error') {\n for (const [windowKey, window] of windows) {\n if (window.deadline < Date.now())\n windows.delete(windowKey)\n }\n for (const before of buffer.filter(entry => entry.scopeId === scopeId && entry.userId === userId && entry.event.requestId === requestId).slice(-100)) pin(before, event.id)\n pin(item, event.id)\n if (windows.has(key) || windows.size < 100)\n windows.set(key, { errorId: event.id, after: 0, deadline: Date.now() + 30000 })\n else rememberLoss(item, 'server_error_window_overflow')\n }\n buffer.push(item)\n totalBytes += bytes\n while (buffer.length > 10000 || totalBytes > 16 * 1024 * 1024 || (buffer[0]?.event.timestamp ?? Date.now()) < Date.now() - 5 * 60000) {\n const removed = buffer.shift()\n totalBytes -= removed?.bytes ?? 0\n if (removed && removed.event.timestamp >= Date.now() - 5 * 60000)\n rememberLoss(removed, 'server_log_buffer_overflow')\n }\n }\n\n const stop = core.logger.observe(observe)\n const timer = setInterval(() => {\n void flush().catch(() => undefined)\n }, 250)\n timer.unref()\n return {\n async collect(scopeId: string, userId: string, anchor: number) {\n await flush()\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('app_id', appId, params)} AND ${feedbackTextEquals('scope_id', scopeId, params)} AND ${feedbackTextEquals('user_id', userId, params)}`\n params.push(anchor - 5 * 60000, anchor + 30000)\n const persisted = await reldb.sql.query<{ payload: unknown }>(`SELECT payload FROM hai_feedback_evidence WHERE report_id IS NULL AND ${identity} AND timestamp >= ? AND timestamp <= ? ORDER BY timestamp DESC, source DESC, sequence DESC LIMIT 1001`, params)\n if (!persisted.success)\n rememberLoss({ scopeId, userId }, 'server_temporary_evidence_read_failed')\n else if (persisted.data.length > 1000)\n rememberLoss({ scopeId, userId }, 'server_evidence_truncated')\n const events = new Map<string, FeedbackEvidenceInput>()\n const saved = persisted.success\n ? persisted.data.slice(0, 1000).reverse().flatMap((row) => {\n try {\n const parsed = FeedbackEvidenceInputSchema.safeParse(readFeedbackJson(row.payload))\n if (parsed.success)\n return [parsed.data]\n }\n catch {\n // 临时记录损坏时保留其他可用证据,缺失标记不包含原始数据库内容。\n }\n rememberLoss({ scopeId, userId }, 'server_temporary_evidence_invalid')\n return []\n })\n : []\n for (const event of saved) {\n const key = `${event.source}:${event.sequence}`\n if (!events.has(key))\n events.set(key, event.kind === 'error' ? { ...event, errorId: event.id } : event)\n }\n const pinnedRequests = new Set([...events.values()].filter(item => item.errorId).map(item => item.requestId))\n const local = buffer.filter(item => item.scopeId === scopeId && item.userId === userId && item.event.timestamp >= anchor - 5 * 60000 && item.event.timestamp <= anchor + 30000)\n const before = local.filter(item => item.event.timestamp <= anchor).slice(-100)\n const after = local.filter(item => item.event.timestamp > anchor).slice(0, 100)\n for (const item of [...before, ...after]) {\n if (!pinnedRequests.has(item.event.requestId))\n events.set(`${item.event.source}:${item.event.sequence}`, item.event)\n }\n for (const [key, item] of losses) {\n if (item.event.timestamp < Date.now() - 5 * 60000) {\n losses.delete(key)\n continue\n }\n if (item.scopeId === scopeId && item.userId === userId && item.event.timestamp >= anchor - 5 * 60000)\n events.set(`${item.event.source}:${item.event.sequence}`, item.event)\n }\n if (capacityLoss && capacityLoss.timestamp >= anchor - 5 * 60000)\n events.set(`${capacityLoss.source}:${capacityLoss.sequence}`, capacityLoss)\n if (events.size > 1000) {\n rememberLoss({ scopeId, userId }, 'server_evidence_truncated')\n const marker = losses.get(JSON.stringify([scopeId, userId, undefined, 'server_evidence_truncated']))?.event\n if (marker)\n events.set(`${marker.source}:${marker.sequence}`, marker)\n }\n const missing = [...events.values()].filter(item => item.kind === 'missing').slice(-1000)\n const logs = [...events.values()].filter(item => item.kind !== 'missing').sort((a, b) => a.timestamp - b.timestamp)\n const allowance = 1000 - missing.length\n return [...allowance > 0 ? logs.slice(-allowance) : [], ...missing].sort((a, b) => a.timestamp - b.timestamp)\n },\n environment(): FeedbackEvidenceInput {\n const env = Object.fromEntries(envAllowlist.filter(key => !core.sanitize.defaultSensitiveKeyRegex.test(key.replace(/([a-z])([A-Z])/g, '$1_$2'))).map(key => [key, process.env[key] ?? null]))\n return FeedbackEvidenceInputSchema.parse({ id: randomUUID(), source, sequence: sequence++, kind: 'environment', timestamp: Date.now(), data: sanitizeFeedbackValue({ appId, service, os: { platform: platform(), release: release(), arch: arch() }, runtime: { name: 'node', version: process.version, uptimeSeconds: Math.floor(process.uptime()), memoryBytes: process.memoryUsage().rss, totalMemoryBytes: totalmem() }, environment: env }) })\n },\n async close() {\n stopped = true\n stop()\n clearInterval(timer)\n await flush()\n },\n }\n}\n\n/**\n * 内部现场采集生命周期句柄。\n * @example 模块内部上下文\n * ```ts\n * function stopCapture(capture: FeedbackCapture) { return capture.close() }\n * ```\n */\nexport type FeedbackCapture = ReturnType<typeof createFeedbackCapture>\n","import { reldb } from '@h-ai/reldb'\n\n/**\n * 租约条件在数据库真正执行时取时钟,避免工作节点时差及行锁等待跨过截止时间。\n * @example 模块内部上下文\n * ```ts\n * const condition = `lease_until > ${feedbackClockSql()}`\n * void condition\n * ```\n */\nexport function feedbackClockSql(): string {\n if (reldb.config?.type === 'postgresql')\n return '(FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000)::bigint)'\n if (reldb.config?.type === 'mysql')\n return '(CAST(UNIX_TIMESTAMP(SYSDATE(3)) * 1000 AS UNSIGNED))'\n return '(CAST((julianday(\\'now\\') - 2440587.5) * 86400000 AS INTEGER))'\n}\n","import type { FeedbackAttachment, FeedbackEvidence, FeedbackEvidenceInput, FeedbackHistory, FeedbackJob, FeedbackReport } from '@h-ai/api-contract/feedback'\nimport type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, DmlWithTxOperations } from '@h-ai/reldb'\nimport type { FeedbackCapture } from './feedback-capture.js'\nimport type { FeedbackConfig } from './feedback-config.js'\nimport type { FeedbackAttachmentRow, FeedbackEvidenceRow, FeedbackJobRow, FeedbackReportRepository, FeedbackReportRow } from './feedback-repository.js'\nimport type { FeedbackContext, FeedbackFunctions } from './feedback-types.js'\nimport { Buffer } from 'node:buffer'\nimport { createHash, randomUUID } from 'node:crypto'\nimport {\n FeedbackAppendEvidenceInputSchema,\n FeedbackAttachmentSchema,\n FeedbackCompleteInputSchema,\n FeedbackEvidenceInputSchema,\n FeedbackEvidenceQuerySchema,\n FeedbackEvidenceSchema,\n FeedbackExportInputSchema,\n FeedbackHistorySchema,\n FeedbackJobSchema,\n FeedbackListInputSchema,\n FeedbackSetStatusInputSchema,\n FeedbackSubmitInputSchema,\n FeedbackUploadInputSchema,\n resolveFeedbackBudget,\n} from '@h-ai/api-contract/feedback'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { storage } from '@h-ai/storage'\nimport { createFeedbackBundle } from './bundle/index.js'\nimport { feedbackClockSql } from './feedback-clock.js'\nimport { feedbackM } from './feedback-i18n.js'\nimport { feedbackTextEquals, readFeedbackJson } from './feedback-repository.js'\nimport { canonicalFeedbackJson, redactFeedbackText, sanitizeFeedbackValue } from './feedback-sanitize.js'\nimport { HaiFeedbackError } from './feedback-types.js'\n\n/**\n * 内部运行时,任务资源由模块生命周期停止。\n * @example 模块内部上下文\n * ```ts\n * async function drain(runtime: FeedbackRuntime) { await runtime.close() }\n * void drain\n * ```\n */\nexport type FeedbackRuntime = Omit<FeedbackFunctions, 'init' | 'close' | 'config' | 'budget' | 'isInitialized'> & { start: () => void, close: () => Promise<void> }\n\n/** 将异常留在公共 HaiResult 边界之内;不向用户返回 SDK/SQL/凭据原文。 */\nfunction failed() {\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n}\nfunction invalid() {\n return err(HaiFeedbackError.INVALID_INPUT, feedbackM('feedback_invalidInput'))\n}\nfunction conflict() {\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n}\nfunction forbidden() {\n return err(HaiFeedbackError.FORBIDDEN, feedbackM('feedback_forbidden'))\n}\nfunction missing() {\n return err(HaiFeedbackError.NOT_FOUND, feedbackM('feedback_notFound'))\n}\nfunction limited() {\n return err(HaiFeedbackError.LIMIT_EXCEEDED, feedbackM('feedback_limitExceeded'))\n}\nfunction hash(value: string | Uint8Array) {\n return createHash('sha256').update(value).digest('hex')\n}\nfunction permitted(actor: FeedbackContext, permission: string) {\n return actor.permissions?.includes('feedback:*') || actor.permissions?.includes(permission)\n}\nfunction validActor(actor: FeedbackContext) {\n return !!actor && typeof actor.scopeId === 'string' && actor.scopeId.length > 0 && actor.scopeId.length <= 128 && typeof actor.userId === 'string' && actor.userId.length > 0 && actor.userId.length <= 128\n}\nfunction escapeHtml(value: string) {\n return value.replace(/[&<>\"']/g, character => ({ '&': '&', '<': '<', '>': '>', '\"': '"', '\\'': ''' })[character] ?? character)\n}\n\n/**\n * 服务端操作编排,数据表/存储/通知均使用依赖的公开入口。\n * @example 模块内部上下文\n * ```ts\n * function createRuntime(repository: FeedbackReportRepository, config: FeedbackConfig, capture: FeedbackCapture) {\n * return createFeedbackOperations(repository, config, capture)\n * }\n * void createRuntime\n * ```\n */\nexport function createFeedbackOperations(repo: FeedbackReportRepository, config: FeedbackConfig, capture: FeedbackCapture): FeedbackRuntime {\n const budget = resolveFeedbackBudget(config)\n const table = repo.tables\n const clock = feedbackClockSql()\n let stopped = false\n let timer: ReturnType<typeof setTimeout> | undefined\n let running: Promise<HaiResult<{ processed: number }>> | null = null\n\n async function access(id: string, actor: FeedbackContext, permission?: string, sql: DmlOperations = reldb.sql): Promise<HaiResult<FeedbackReportRow>> {\n if (!validActor(actor))\n return forbidden()\n const result = await repo.find(id, actor.scopeId, sql)\n if (!result.success)\n return result\n if (!result.data || result.data.id !== id || result.data.scope_id !== actor.scopeId || result.data.app_id !== config.appId || Number(result.data.deleting))\n return missing()\n if (permission ? !permitted(actor, permission) : (result.data.user_id !== actor.userId && !permitted(actor, 'feedback:read')))\n return forbidden()\n return ok(result.data)\n }\n\n async function accessWrite(id: string, actor: FeedbackContext, sql: DmlOperations = reldb.sql) {\n const result = await access(id, actor, permitted(actor, 'feedback:process') ? 'feedback:process' : undefined, sql)\n if (!result.success)\n return result\n return result.data.user_id === actor.userId || permitted(actor, 'feedback:process') ? result : forbidden()\n }\n\n async function insertJob(tx: DmlOperations, report: FeedbackReport, kind: FeedbackJobRow['kind'], suffix: string, payload: unknown, nextRun: number) {\n const id = hash(`${report.id}:${kind}:${suffix}`)\n const previous = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE id = ?`, [id])\n if (!previous.success)\n return previous\n if (previous.data)\n return ok(id)\n const now = Date.now()\n const inserted = await tx.execute(`INSERT INTO ${table.jobs} (id, app_id, snapshot_revision, snapshot_version, report_id, scope_id, kind, status, token, lease_until, attempts, next_run_at, created_at, updated_at, last_error, payload, result) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ${clock} + ?, ?, ?, ?, ?, ?)`, [id, config.appId, kind === 'export' ? report.evidenceRevision : null, kind === 'export' ? report.version : null, report.id, report.scopeId, kind, 'pending', null, 0, 0, Math.max(0, nextRun - now), now, now, null, JSON.stringify(payload), null])\n return inserted.success ? ok(id) : inserted\n }\n\n function jobData(row: FeedbackJobRow): FeedbackJob {\n const result = readFeedbackJson(row.result)\n return FeedbackJobSchema.parse({ id: row.id, feedbackId: row.report_id, type: row.kind, status: row.status, attempts: Number(row.attempts), createdAt: Number(row.created_at), updatedAt: Number(row.updated_at), nextRunAt: Number(row.next_run_at), lastError: row.last_error ?? undefined, result: result && typeof result === 'object' ? { available: true } : undefined })\n }\n\n function attachmentData(row: FeedbackAttachmentRow): FeedbackAttachment {\n return FeedbackAttachmentSchema.parse({ ...FeedbackAttachmentSchema.parse(readFeedbackJson(row.payload)), status: row.status })\n }\n\n async function appendInside(tx: DmlWithTxOperations, row: FeedbackReportRow, events: FeedbackEvidenceInput[], internal = false): Promise<HaiResult<{ acknowledged: string[], evidenceRevision: number }>> {\n const acknowledged: string[] = []\n const additions: Array<{ key: string, event: FeedbackEvidenceInput, bytes: number }> = []\n for (const input of events) {\n if (!internal && input.source.startsWith('server:'))\n return invalid()\n const event = FeedbackEvidenceInputSchema.parse(sanitizeFeedbackValue(input))\n const key = hash(`${row.id}:${event.source}:${event.sequence}`)\n const previous = await tx.get<FeedbackEvidenceRow>(`SELECT * FROM ${table.evidence} WHERE id = ?`, [key])\n if (!previous.success)\n return previous\n if (previous.data) {\n if (canonicalFeedbackJson(readFeedbackJson(previous.data.payload)) !== canonicalFeedbackJson(event))\n return conflict()\n }\n else {\n const bytes = Buffer.byteLength(JSON.stringify(event))\n if (bytes > 1024 * 1024)\n return limited()\n const staged = additions.find(item => item.key === key)\n if (staged && canonicalFeedbackJson(staged.event) !== canonicalFeedbackJson(event))\n return conflict()\n if (!staged)\n additions.push({ key, event, bytes })\n }\n acknowledged.push(event.id)\n }\n if (!additions.length)\n return ok({ acknowledged, evidenceRevision: Number(row.revision) })\n const bytes = additions.reduce((total, item) => total + item.bytes, 0)\n const revision = Number(row.revision) + 1\n const params: unknown[] = [additions.length, bytes, revision, Date.now()]\n const identity = `${feedbackTextEquals('id', row.id, params)} AND ${feedbackTextEquals('scope_id', row.scope_id, params)}`\n params.push(row.revision, additions.length, budget.maxEvidenceCount, bytes, budget.maxEvidenceBytes)\n const changed = await tx.execute(`UPDATE ${table.reports} SET evidence_count = evidence_count + ?, evidence_bytes = evidence_bytes + ?, revision = ?, updated_at = ? WHERE ${identity} AND revision = ? AND deleting = 0 AND evidence_count + ? <= ? AND evidence_bytes + ? <= ?`, params)\n if (!changed.success)\n return changed\n if (!changed.data.changes)\n return Number(row.evidence_count) + additions.length > budget.maxEvidenceCount || Number(row.evidence_bytes) + bytes > budget.maxEvidenceBytes ? limited() : conflict()\n for (const { key, event, bytes: itemBytes } of additions) {\n const inserted = await tx.execute(`INSERT INTO ${table.evidence} (id, report_id, scope_id, user_id, app_id, source, sequence, kind, timestamp, request_id, error_id, revision, bytes, expires_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [key, row.id, row.scope_id, row.user_id, row.app_id, event.source, event.sequence, event.kind, event.timestamp, event.requestId ?? null, event.errorId ?? null, revision, itemBytes, row.expires_at, JSON.stringify(event)])\n if (!inserted.success)\n return inserted\n }\n return ok({ acknowledged, evidenceRevision: revision })\n }\n\n async function appendInternal(id: string, actor: FeedbackContext, events: FeedbackEvidenceInput[]) {\n return repo.transaction(async (tx) => {\n const row = await access(id, actor, undefined, tx)\n return row.success ? appendInside(tx, row.data, events, true) : row\n })\n }\n\n async function attachments(id: string, sql: DmlOperations = reldb.sql) {\n return sql.query<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE report_id = ? ORDER BY id`, [id])\n }\n async function withLease<T>(job: FeedbackJobRow, work: (tx: DmlWithTxOperations) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n return repo.transaction(async (tx) => {\n const lock = reldb.config?.type === 'sqlite' ? '' : ' FOR UPDATE'\n const owned = await tx.get(`SELECT id FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}${lock}`, [job.id, job.token])\n if (!owned.success)\n return owned\n if (!owned.data)\n return conflict()\n const result = await work(tx)\n if (!result.success)\n return result\n const stillOwned = await tx.get(`SELECT id FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [job.id, job.token])\n return stillOwned.success && stillOwned.data ? result : conflict()\n })\n }\n\n async function notificationSummary(id: string) {\n if (config.notificationMode === 'disabled')\n return reldb.sql.execute(`UPDATE ${table.reports} SET notification_status = 'disabled' WHERE id = ?`, [id])\n return reldb.sql.execute(`UPDATE ${table.reports} SET notification_status = CASE\n WHEN EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND (status = 'failed' OR last_error IS NOT NULL)) THEN 'failed'\n WHEN NOT EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND status <> 'succeeded') THEN 'sent'\n WHEN EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND status = 'running') THEN 'sending'\n WHEN EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND status = 'pending' AND result IS NOT NULL) THEN 'deferred'\n ELSE 'pending' END WHERE id = ?`, [id, id, id, id, id])\n }\n async function history(id: string, sql: DmlOperations = reldb.sql) {\n const result = await sql.query<{ payload: unknown }>(`SELECT payload FROM ${table.history} WHERE report_id = ? ORDER BY id`, [id])\n return result.success ? ok(result.data.map(row => FeedbackHistorySchema.parse(readFeedbackJson(row.payload)))) : result\n }\n async function evidence(id: string, revision: number, sql: DmlOperations = reldb.sql) {\n const result = await sql.query<FeedbackEvidenceRow>(`SELECT * FROM ${table.evidence} WHERE report_id = ? AND revision <= ? ORDER BY timestamp, source, sequence`, [id, revision])\n return result.success ? ok(result.data.map(row => FeedbackEvidenceSchema.parse({ ...FeedbackEvidenceInputSchema.parse(readFeedbackJson(row.payload)), feedbackId: id, revision: Number(row.revision) }))) : result\n }\n\n const operations: FeedbackRuntime = {\n start() {\n if (!config.workerIntervalMs || stopped)\n return\n const tick = async () => {\n if (stopped)\n return\n await operations.runJobs()\n if (!stopped) {\n timer = setTimeout(() => {\n void tick()\n }, config.workerIntervalMs)\n timer.unref()\n }\n }\n timer = setTimeout(() => {\n void tick()\n }, config.workerIntervalMs)\n timer.unref()\n },\n async close() {\n stopped = true\n if (timer)\n clearTimeout(timer)\n await running\n },\n\n async submit(input, actor) {\n if (!validActor(actor))\n return forbidden()\n if (actor.permissions !== undefined && !permitted(actor, 'feedback:create'))\n return forbidden()\n const parsed = FeedbackSubmitInputSchema.safeParse(input)\n if (!parsed.success || parsed.data.appId !== config.appId)\n return invalid()\n const sanitized = FeedbackSubmitInputSchema.parse(sanitizeFeedbackValue(parsed.data))\n const submissionKey = hash(JSON.stringify([actor.scopeId, actor.userId, config.appId, sanitized.submissionId]))\n const digest = hash(canonicalFeedbackJson(sanitized))\n const existing = await reldb.sql.get<FeedbackReportRow>(`SELECT * FROM ${table.reports} WHERE submission_key = ?`, [submissionKey])\n if (!existing.success)\n return existing\n if (existing.data && (existing.data.scope_id !== actor.scopeId || existing.data.user_id !== actor.userId || existing.data.app_id !== config.appId))\n return conflict()\n if (existing.data && Number(existing.data.deleting))\n return missing()\n if (existing.data)\n return existing.data.submission_hash === digest ? ok(repo.report(existing.data)) : conflict()\n const now = Date.now()\n const id = `fb_${randomUUID()}`\n const report: FeedbackReport = {\n id,\n number: `FB-${new Date(now).toISOString().slice(0, 10).replaceAll('-', '')}-${id.slice(-8).toUpperCase()}`,\n appId: config.appId,\n scopeId: actor.scopeId,\n userId: actor.userId,\n description: sanitized.description,\n category: sanitized.category,\n contact: sanitized.contact,\n url: sanitized.url,\n summary: (sanitized.description?.trim() || sanitized.url || feedbackM('feedback_defaultSummary')).slice(0, 200),\n appVersion: sanitized.appVersion ?? config.appVersion,\n buildId: sanitized.buildId ?? config.buildId,\n commit: sanitized.commit ?? config.commit,\n status: 'pending',\n collectionStatus: 'collecting',\n notificationStatus: config.notificationMode === 'disabled' ? 'disabled' : 'pending',\n createdAt: now,\n updatedAt: now,\n version: 1,\n evidenceRevision: 1,\n }\n const row: FeedbackReportRow = { id, scope_id: actor.scopeId, user_id: actor.userId, app_id: config.appId, number: report.number, app_version: report.appVersion ?? null, summary: report.summary ?? '', submission_key: submissionKey, submission_hash: digest, status: 'pending', collection_status: 'collecting', notification_status: report.notificationStatus, created_at: now, updated_at: now, version: 1, revision: 1, evidence_count: 0, evidence_bytes: 0, collect_deadline: now + config.collectionTimeoutMs, expires_at: now + config.retentionDays * 86400000, payload: report, deleting: 0 }\n const result = await repo.transaction(async (tx) => {\n const inserted = await repo.create({ ...row }, tx)\n if (!inserted.success)\n return inserted\n const initial = await appendInside(tx, row, sanitized.evidence ?? [])\n if (!initial.success)\n return initial\n if ((sanitized.attachments ?? []).reduce((total, file) => total + file.size, 0) > budget.maxAttachmentsBytes)\n return limited()\n for (const attachment of sanitized.attachments ?? []) {\n if (attachment.size > budget.maxAttachmentBytes || !allowedContentType(attachment.contentType))\n return invalid()\n const attachmentId = hash(`${id}:${attachment.id}`)\n const data: FeedbackAttachment = { ...attachment, feedbackId: id, status: 'pending' }\n const saved = await tx.execute(`INSERT INTO ${table.attachments} (id, client_id, report_id, scope_id, object_key, status, size, checksum, updated_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [attachmentId, attachment.id, id, actor.scopeId, `feedback/${hash(actor.scopeId).slice(0, 16)}/${id}/${attachmentId}`, 'pending', attachment.size, attachment.checksum, now, JSON.stringify(data)])\n if (!saved.success)\n return saved\n }\n for (const recipient of config.notificationMode === 'disabled' ? [] : config.notificationMode === 'console' ? ['console'] : config.recipients) {\n const saved = await insertJob(tx, report, 'notify', recipient, { recipient }, row.collect_deadline)\n if (!saved.success)\n return saved\n }\n const collected = await insertJob(tx, report, 'collect', 'initial', { anchor: sanitized.anchor?.timestamp ?? now }, row.collect_deadline)\n if (!collected.success)\n return collected\n const cleanup = await insertJob(tx, report, 'cleanup', 'expiry', {}, row.expires_at)\n if (!cleanup.success)\n return cleanup\n return ok({ ...report, evidenceRevision: initial.data.evidenceRevision })\n })\n if (!result.success) {\n const duplicate = await reldb.sql.get<FeedbackReportRow>(`SELECT * FROM ${table.reports} WHERE submission_key = ?`, [submissionKey])\n if (!duplicate.success || !duplicate.data)\n return result\n if (duplicate.data.scope_id !== actor.scopeId || duplicate.data.user_id !== actor.userId || duplicate.data.app_id !== config.appId)\n return conflict()\n if (Number(duplicate.data.deleting))\n return missing()\n return duplicate.data.submission_hash === digest ? ok(repo.report(duplicate.data)) : conflict()\n }\n const environment = await appendInternal(id, actor, [capture.environment()])\n // 已可靠受理后补采失败不会伪装为未受理;后台任务继续补齐并标明状态。\n if (!environment.success)\n core.logger.warn('Feedback environment collection deferred', { module: 'feedback', feedbackId: id })\n const current = await repo.find(id, actor.scopeId)\n return current.success && current.data ? ok(repo.report(current.data)) : result\n },\n\n async list(input, actor) {\n if (!validActor(actor) || !permitted(actor, 'feedback:read'))\n return forbidden()\n const parsed = FeedbackListInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const query = parsed.data\n if (query.from !== undefined && query.to !== undefined && query.from > query.to)\n return invalid()\n const params: unknown[] = []\n const conditions = [feedbackTextEquals('scope_id', actor.scopeId, params), feedbackTextEquals('app_id', config.appId, params), 'deleting = 0']\n for (const [column, value] of [['status', query.status], ['collection_status', query.collectionStatus], ['notification_status', query.notificationStatus], ['app_id', query.appId]] as const) {\n if (value) {\n if (column === 'app_id') {\n conditions.push(feedbackTextEquals(column, value, params))\n }\n else {\n conditions.push(`${column} = ?`)\n params.push(value)\n }\n }\n }\n if (query.from !== undefined) {\n conditions.push('created_at >= ?')\n params.push(query.from)\n }\n if (query.to !== undefined) {\n conditions.push('created_at <= ?')\n params.push(query.to)\n }\n // 用独立的短摘要列执行跨数据库筛选,不扫描诊断 JSON 大字段。\n if (query.search) {\n conditions.push('(number LIKE ? ESCAPE \\'!\\' OR summary LIKE ? ESCAPE \\'!\\')')\n const search = `%${query.search.replaceAll('!', '!!').replaceAll('%', '!%').replaceAll('_', '!_')}%`\n params.push(search, search)\n }\n if (query.appVersion) {\n conditions.push('app_version = ?')\n params.push(query.appVersion)\n }\n const direction = query.sortDirection === 'asc' ? 'ASC' : 'DESC'\n const page = await reldb.sql.queryPage<FeedbackReportRow>({ sql: `SELECT * FROM ${table.reports} WHERE ${conditions.join(' AND ')} ORDER BY created_at ${direction}, id ${direction}`, params, pagination: { page: query.page, pageSize: query.pageSize } })\n return page.success ? ok({ ...page.data, items: page.data.items.map(row => repo.report(row)) }) : page\n },\n\n async get(id, actor) {\n const report = await access(id, actor)\n if (!report.success)\n return report\n const files = await attachments(id)\n if (!files.success)\n return files\n const changes = await history(id)\n if (!changes.success)\n return changes\n const jobs = await reldb.sql.query<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE report_id = ? ORDER BY created_at, id`, [id])\n return jobs.success ? ok({ report: repo.report(report.data), attachments: files.data.map(attachmentData), history: changes.data, jobs: jobs.data.map(jobData) }) : jobs\n },\n\n async getEvidence(input, actor) {\n const parsed = FeedbackEvidenceQuerySchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const accessResult = await access(parsed.data.id, actor)\n if (!accessResult.success)\n return accessResult\n const query = parsed.data\n const params: unknown[] = []\n const conditions = [feedbackTextEquals('report_id', query.id, params), feedbackTextEquals('scope_id', actor.scopeId, params)]\n for (const [column, value] of [['source', query.source], ['kind', query.kind], ['request_id', query.requestId]] as const) {\n if (value) {\n if (column === 'kind') {\n conditions.push(`${column} = ?`)\n params.push(value)\n }\n else {\n conditions.push(feedbackTextEquals(column, value, params))\n }\n }\n }\n if (query.errorId) {\n const anchorParams: unknown[] = []\n const anchorIdentity = `${feedbackTextEquals('report_id', query.id, anchorParams)} AND ${feedbackTextEquals('error_id', query.errorId, anchorParams)}`\n const anchor = await reldb.sql.get<FeedbackEvidenceRow>(`SELECT * FROM ${table.evidence} WHERE ${anchorIdentity} AND kind = 'error'`, anchorParams)\n if (!anchor.success)\n return anchor\n if (!anchor.data)\n return ok({ items: [], total: 0, page: query.page ?? 1, pageSize: query.pageSize ?? 20 })\n const contextParams: unknown[] = []\n const contextIdentity = `${feedbackTextEquals('report_id', query.id, contextParams)} AND ${feedbackTextEquals('source', anchor.data.source, contextParams)}`\n const request = anchor.data.request_id ? feedbackTextEquals('request_id', anchor.data.request_id, contextParams) : 'request_id IS NULL'\n const before = await reldb.sql.query<{ id: string }>(`SELECT id FROM ${table.evidence} WHERE ${contextIdentity} AND ${request} AND kind IN ('log', 'error') AND sequence <= ? ORDER BY sequence DESC LIMIT 101`, [...contextParams, anchor.data.sequence])\n if (!before.success)\n return before\n const after = await reldb.sql.query<{ id: string }>(`SELECT id FROM ${table.evidence} WHERE ${contextIdentity} AND ${request} AND kind IN ('log', 'error') AND sequence > ? ORDER BY sequence ASC LIMIT 100`, [...contextParams, anchor.data.sequence])\n if (!after.success)\n return after\n const ids = [...before.data, ...after.data].map(row => row.id)\n conditions.push(`id IN (${ids.map(() => '?').join(',')})`)\n params.push(...ids)\n }\n if (query.from !== undefined) {\n conditions.push('timestamp >= ?')\n params.push(query.from)\n }\n if (query.to !== undefined) {\n conditions.push('timestamp <= ?')\n params.push(query.to)\n }\n const page = await reldb.sql.queryPage<FeedbackEvidenceRow>({ sql: `SELECT * FROM ${table.evidence} WHERE ${conditions.join(' AND ')} ORDER BY timestamp, source, sequence`, params, pagination: { page: query.page, pageSize: query.pageSize } })\n return page.success ? ok({ ...page.data, items: page.data.items.map(row => FeedbackEvidenceSchema.parse({ ...FeedbackEvidenceInputSchema.parse(readFeedbackJson(row.payload)), feedbackId: query.id, revision: Number(row.revision) })) }) : page\n },\n\n async setStatus(input, actor) {\n const parsed = FeedbackSetStatusInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n return repo.transaction(async (tx) => {\n const row = await access(input.id, actor, input.status === 'handled' ? 'feedback:process' : 'feedback:reopen', tx)\n if (!row.success)\n return row\n if (Number(row.data.version) !== parsed.data.expectedVersion)\n return conflict()\n if (row.data.status === parsed.data.status)\n return ok(repo.report(row.data))\n const now = Date.now()\n const params: unknown[] = [parsed.data.status, now]\n const identity = `${feedbackTextEquals('id', input.id, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n params.push(parsed.data.expectedVersion)\n const updated = await tx.execute(`UPDATE ${table.reports} SET status = ?, version = version + 1, updated_at = ? WHERE ${identity} AND version = ?`, params)\n if (!updated.success)\n return updated\n if (!updated.data.changes)\n return conflict()\n const change: FeedbackHistory = { id: randomUUID(), feedbackId: input.id, userId: actor.userId, from: repo.report(row.data).status, to: parsed.data.status, timestamp: now, note: parsed.data.note ? redactFeedbackText(parsed.data.note) : undefined }\n const previousHistory = await history(input.id, tx)\n if (!previousHistory.success)\n return previousHistory\n if (Buffer.byteLength(JSON.stringify([...previousHistory.data, change])) > 256 * 1024)\n return limited()\n const saved = await tx.execute(`INSERT INTO ${table.history} (id, report_id, payload) VALUES (?, ?, ?)`, [change.id, input.id, JSON.stringify(change)])\n return saved.success ? ok({ ...repo.report(row.data), status: parsed.data.status, version: parsed.data.expectedVersion + 1, updatedAt: now }) : saved\n })\n },\n\n async appendEvidence(input, actor) {\n const parsed = FeedbackAppendEvidenceInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n return repo.transaction(async (tx) => {\n const row = await accessWrite(input.id, actor, tx)\n if (!row.success)\n return row\n if (Number(row.data.collect_deadline) + 5 * 60000 < Date.now())\n return conflict()\n return appendInside(tx, row.data, parsed.data.evidence)\n })\n },\n\n async completeCollection(input, actor) {\n const parsed = FeedbackCompleteInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const row = await accessWrite(input.id, actor)\n if (!row.success)\n return row\n if (parsed.data.missing?.length) {\n const saved = await appendInternal(input.id, actor, [{ id: randomUUID(), source: 'collection', sequence: Date.now(), kind: 'missing', timestamp: Date.now(), data: { missing: parsed.data.missing }, missingReason: 'collection_incomplete' }])\n if (!saved.success)\n return saved\n }\n const next = await reldb.sql.execute(`UPDATE ${table.jobs} SET next_run_at = ${clock}, updated_at = ${clock} WHERE report_id = ? AND kind IN ('collect', 'notify') AND status = 'pending'`, [input.id])\n return next.success ? ok(repo.report(row.data)) : next\n },\n\n async uploadAttachment(input, actor) {\n return upload(input, actor)\n },\n async getAttachment(input, actor) {\n const row = await access(input.id, actor)\n if (!row.success)\n return row\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('client_id', input.attachmentId, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const found = await reldb.sql.get<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE ${identity}`, params)\n if (!found.success)\n return found\n if (!found.data || found.data.report_id !== input.id || found.data.scope_id !== actor.scopeId || found.data.client_id !== input.attachmentId || found.data.status !== 'available')\n return missing()\n const bytes = await storage.file.get(found.data.object_key)\n if (!bytes.success)\n return bytes\n if (hash(bytes.data) !== found.data.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n const metadata = attachmentData(found.data)\n return ok({ name: metadata.name, contentType: metadata.contentType, dataBase64: bytes.data.toString('base64') })\n },\n\n async retry(input, actor) {\n const permission = input.target === 'export' ? 'feedback:export' : 'feedback:process'\n const row = await access(input.id, actor, permission)\n if (!row.success)\n return row\n if (input.target === 'attachment') {\n const params: unknown[] = [Date.now()]\n const identity = `${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('client_id', input.targetId ?? '', params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const updated = await reldb.sql.execute(`UPDATE ${table.attachments} SET status = 'pending', updated_at = ? WHERE ${identity} AND status = 'failed'`, params)\n return updated.success ? ok(undefined) : updated\n }\n const updated = await reldb.sql.execute(`UPDATE ${table.jobs} SET status = 'pending', attempts = 0, next_run_at = ${clock}, last_error = NULL WHERE report_id = ? AND kind = ? AND status IN ('failed', 'pending')`, [input.id, input.target])\n if (updated.success && input.target === 'collect') {\n const resumed = await reldb.sql.execute(`UPDATE ${table.reports} SET collection_status = 'collecting' WHERE id = ? AND deleting = 0 AND EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'collect' AND status = 'pending')`, [input.id, input.id])\n if (!resumed.success)\n return resumed\n }\n return updated.success ? ok(undefined) : updated\n },\n\n async export(input, actor) {\n const parsed = FeedbackExportInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n return repo.transaction(async (tx) => {\n const row = await access(input.id, actor, 'feedback:export', tx)\n if (!row.success)\n return row\n const revision = parsed.data.evidenceRevision ?? Number(row.data.revision)\n if (revision > Number(row.data.revision))\n return conflict()\n const snapshotVersion = revision === Number(row.data.revision) ? ' AND snapshot_version = ?' : ''\n const previous = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE report_id = ? AND kind = 'export' AND snapshot_revision = ?${snapshotVersion} ORDER BY created_at DESC, id DESC LIMIT 1`, [input.id, revision, ...(snapshotVersion ? [row.data.version] : [])])\n if (!previous.success)\n return previous\n if (previous.data) {\n const snapshot = readFeedbackJson(previous.data.payload)\n const live = snapshot && typeof snapshot === 'object' && 'snapshotExpiresAt' in snapshot && typeof snapshot.snapshotExpiresAt === 'number' && snapshot.snapshotExpiresAt > Date.now()\n if (previous.data.status === 'succeeded' || live)\n return ok(jobData(previous.data))\n }\n if (revision < Number(row.data.revision)) {\n return missing()\n }\n const events = await evidence(input.id, revision, tx)\n if (!events.success)\n return events\n const files = await attachments(input.id, tx)\n if (!files.success)\n return files\n const changes = await history(input.id, tx)\n if (!changes.success)\n return changes\n const suffix = `${revision}:${row.data.version}${previous.data ? `:${previous.data.id}` : ''}`\n const added = await insertJob(tx, repo.report(row.data), 'export', suffix, { report: repo.report(row.data), evidence: events.data, attachments: files.data, history: changes.data, snapshotExpiresAt: Date.now() + 3600000 }, Date.now())\n if (!added.success)\n return added\n const job = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE id = ?`, [added.data])\n return job.success && job.data ? ok(jobData(job.data)) : missing()\n })\n },\n\n async getExport(input, actor) {\n const row = await access(input.id, actor, 'feedback:export')\n if (!row.success)\n return row\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('id', input.jobId, params)} AND ${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)} AND ${feedbackTextEquals('app_id', config.appId, params)}`\n const job = await reldb.sql.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE ${identity} AND kind = 'export'`, params)\n if (!job.success)\n return job\n if (!job.data)\n return missing()\n if (job.data.status === 'pending' || job.data.status === 'running') {\n const snapshot = readFeedbackJson(job.data.payload)\n if (!snapshot || typeof snapshot !== 'object' || !('snapshotExpiresAt' in snapshot) || typeof snapshot.snapshotExpiresAt !== 'number')\n return failed()\n if (snapshot.snapshotExpiresAt < Date.now())\n return missing()\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_exportPending'))\n }\n if (job.data.status === 'failed')\n return failed()\n const data = readFeedbackJson(job.data.result)\n if (!data || typeof data !== 'object' || !('key' in data) || typeof data.key !== 'string')\n return missing()\n const bytes = await storage.file.get(data.key)\n if (!bytes.success)\n return bytes\n if (!('checksum' in data) || typeof data.checksum !== 'string' || hash(bytes.data) !== data.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n return ok({ name: `${repo.report(row.data).number}.zip`, contentType: 'application/zip', dataBase64: bytes.data.toString('base64') })\n },\n\n async runJobs() {\n if (stopped)\n return err(HaiFeedbackError.NOT_INITIALIZED, feedbackM('feedback_notInitialized'))\n if (running)\n return running\n running = core.context.run({ suppressLogObservers: true }, processJobs).catch(failed).finally(() => {\n running = null\n })\n return running\n },\n }\n\n // 附件和后台任务在同一运行时内共享受权查询与固定快照。\n async function upload(input: Parameters<FeedbackFunctions['uploadAttachment']>[0], actor: FeedbackContext): ReturnType<FeedbackFunctions['uploadAttachment']> {\n const parsed = FeedbackUploadInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const row = await accessWrite(input.id, actor)\n if (!row.success)\n return row\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('client_id', input.attachmentId, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const found = await reldb.sql.get<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE ${identity}`, params)\n if (!found.success)\n return found\n if (!found.data || found.data.report_id !== input.id || found.data.scope_id !== actor.scopeId || found.data.client_id !== input.attachmentId)\n return missing()\n const attachment = found.data\n const metadata = attachmentData(attachment)\n const bytes = Buffer.from(parsed.data.dataBase64, 'base64')\n if (bytes.length !== Number(attachment.size) || bytes.length > budget.maxAttachmentBytes || !matchesContentType(bytes, metadata.contentType))\n return invalid()\n if (hash(bytes) !== attachment.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n const stored = await storage.file.put(attachment.object_key, bytes, { contentType: metadata.contentType, ifNoneMatch: '*', signal: AbortSignal.timeout(30000) })\n if (!stored.success) {\n const existing = await storage.file.get(attachment.object_key)\n if (!existing.success || hash(existing.data) !== attachment.checksum) {\n await reldb.sql.execute(`UPDATE ${table.attachments} SET status = 'failed', updated_at = ? WHERE id = ? AND status <> 'available'`, [Date.now(), attachment.id])\n return stored\n }\n }\n const updated = await repo.transaction(async (tx) => {\n const live = await accessWrite(input.id, actor, tx)\n if (!live.success)\n return live\n const currentParams: unknown[] = []\n const currentIdentity = `${feedbackTextEquals('id', attachment.id, currentParams)} AND ${feedbackTextEquals('scope_id', actor.scopeId, currentParams)}`\n const currentFile = await tx.get<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE ${currentIdentity}`, currentParams)\n if (!currentFile.success)\n return currentFile\n if (!currentFile.data || currentFile.data.id !== attachment.id || currentFile.data.report_id !== input.id || currentFile.data.scope_id !== actor.scopeId || currentFile.data.client_id !== input.attachmentId)\n return missing()\n if (currentFile.data.status === 'available')\n return ok(undefined)\n const confirmed = await tx.execute(`UPDATE ${table.attachments} SET status = 'available', updated_at = ${clock} WHERE ${currentIdentity}`, currentParams)\n if (!confirmed.success)\n return confirmed\n if (!confirmed.data.changes)\n return conflict()\n const revised = await tx.execute(`UPDATE ${table.reports} SET revision = revision + 1, updated_at = ${clock} WHERE id = ? AND deleting = 0`, [input.id])\n return revised.success && revised.data.changes ? ok(undefined) : conflict()\n })\n if (!updated.success) {\n if (updated.error.code === HaiFeedbackError.NOT_FOUND.code)\n await storage.file.delete(attachment.object_key)\n return updated\n }\n return ok({ ...metadata, status: 'available' })\n }\n\n async function processJobs(): Promise<HaiResult<{ processed: number }>> {\n let processed = 0\n const candidateParams: unknown[] = []\n const appIdentity = feedbackTextEquals('app_id', config.appId, candidateParams)\n const candidates = await reldb.sql.query<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE ${appIdentity} AND ((status = 'pending' AND next_run_at <= ${clock}) OR (status = 'running' AND lease_until < ${clock})) ORDER BY next_run_at, id LIMIT 20`, candidateParams)\n if (!candidates.success)\n return candidates\n for (const job of candidates.data) {\n if (stopped)\n break\n if (job.app_id !== config.appId)\n continue\n const token = randomUUID()\n const claimParams: unknown[] = [token, config.leaseMs, job.id]\n const claimIdentity = feedbackTextEquals('app_id', config.appId, claimParams)\n const claimed = await reldb.sql.execute(`UPDATE ${table.jobs} SET status = 'running', token = ?, lease_until = ${clock} + ?, attempts = attempts + 1, updated_at = ${clock} WHERE id = ? AND ${claimIdentity} AND ((status = 'pending' AND next_run_at <= ${clock}) OR (status = 'running' AND lease_until < ${clock}))`, claimParams)\n if (!claimed.success)\n return claimed\n if (!claimed.data.changes)\n continue\n if (job.kind === 'notify')\n await notificationSummary(job.report_id)\n const renewal = setInterval(() => {\n void reldb.sql.execute(`UPDATE ${table.jobs} SET lease_until = ${clock} + ? WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [config.leaseMs, job.id, token])\n }, Math.max(250, Math.floor(config.leaseMs / 3)))\n renewal.unref()\n try {\n const result = await executeJob({ ...job, token, attempts: Number(job.attempts) + 1 })\n const pendingReceipt = result.success && !!result.data && typeof result.data === 'object' && 'pending' in result.data && result.data.pending === true\n const purged = result.success && !!result.data && typeof result.data === 'object' && 'purged' in result.data && result.data.purged === true\n const status = result.success ? pendingReceipt ? 'pending' : 'succeeded' : job.kind !== 'cleanup' && Number(job.attempts) + 1 >= config.maxAttempts ? 'failed' : 'pending'\n const saved = purged\n ? await reldb.sql.execute(`DELETE FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [job.id, token])\n : await reldb.sql.execute(`UPDATE ${table.jobs} SET status = ?, attempts = attempts - ?, token = NULL, lease_until = 0, next_run_at = ${clock} + ?, updated_at = ${clock}, last_error = ?, result = CASE WHEN ? = 1 THEN ? ELSE result END WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [status, pendingReceipt ? 1 : 0, Math.min(60000, 1000 * 2 ** Math.min(Number(job.attempts), 6)), result.success ? null : result.error.code, result.success ? 1 : 0, result.success ? JSON.stringify(result.data) : null, job.id, token])\n if (!saved.success)\n return saved\n if (saved.data.changes && status === 'failed' && job.kind === 'collect') {\n const terminal = await reldb.sql.execute(`UPDATE ${table.reports} SET collection_status = 'failed', updated_at = ${clock} WHERE id = ? AND deleting = 0 AND EXISTS (SELECT 1 FROM ${table.jobs} WHERE id = ? AND status = 'failed')`, [job.report_id, job.id])\n if (!terminal.success)\n return terminal\n }\n // 丢失租约的导出结果不能成为有效成品,补偿删除本次独立对象。\n if (!saved.data.changes && job.kind === 'export' && result.success && result.data && typeof result.data === 'object' && 'key' in result.data && typeof result.data.key === 'string')\n await storage.file.delete(result.data.key)\n if (job.kind === 'notify')\n await notificationSummary(job.report_id)\n processed++\n }\n catch {\n await reldb.sql.execute(`UPDATE ${table.jobs} SET status = ?, next_run_at = ${clock} + 60000, last_error = ?, token = NULL, lease_until = 0 WHERE id = ? AND token = ? AND lease_until > ${clock}`, [job.kind === 'cleanup' ? 'pending' : 'failed', HaiFeedbackError.OPERATION_FAILED.code, job.id, token])\n if (job.kind === 'collect')\n await reldb.sql.execute(`UPDATE ${table.reports} SET collection_status = 'failed', updated_at = ${clock} WHERE id = ? AND deleting = 0 AND EXISTS (SELECT 1 FROM ${table.jobs} WHERE id = ? AND status = 'failed')`, [job.report_id, job.id])\n }\n finally {\n clearInterval(renewal)\n }\n }\n const expired = await reldb.sql.execute(`DELETE FROM ${table.evidence} WHERE report_id IS NULL AND expires_at < ?`, [Date.now()])\n return expired.success ? ok({ processed }) : expired\n }\n\n async function executeJob(job: FeedbackJobRow): Promise<HaiResult<unknown>> {\n if (job.app_id !== config.appId)\n return missing()\n const owned = await reldb.sql.get(`SELECT id FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [job.id, job.token])\n if (!owned.success)\n return owned\n if (!owned.data)\n return conflict()\n const raw = readFeedbackJson(job.payload)\n const payload = raw && typeof raw === 'object' ? raw : {}\n const prefix = `feedback/${hash(job.scope_id).slice(0, 16)}/${job.report_id}/`\n if (job.kind === 'cleanup' && 'tombstone' in payload && payload.tombstone === true) {\n const cleared = await storage.dir.delete(prefix)\n if (!cleared.success)\n return cleared\n return 'until' in payload && typeof payload.until === 'number' && payload.until <= Date.now() ? ok({ purged: true }) : ok({ pending: true })\n }\n const row = await repo.find(job.report_id, job.scope_id)\n if (!row.success)\n return row\n if (!row.data || row.data.id !== job.report_id || row.data.scope_id !== job.scope_id || row.data.app_id !== config.appId)\n return missing()\n if (Number(row.data.deleting) && job.kind !== 'cleanup')\n return missing()\n const report = repo.report(row.data)\n const actor: FeedbackContext = { scopeId: report.scopeId, userId: report.userId, permissions: ['feedback:*'] }\n if (job.kind === 'collect') {\n const anchor = 'anchor' in payload && typeof payload.anchor === 'number' ? payload.anchor : report.createdAt\n const captured = await capture.collect(report.scopeId, report.userId, anchor)\n const saved = await withLease(job, async (tx) => {\n const fresh = await access(report.id, actor, undefined, tx)\n return fresh.success ? appendInside(tx, fresh.data, captured.length ? captured : [{ id: `missing-server-${report.id}`, source: 'collection', sequence: 0, kind: 'missing', timestamp: report.createdAt, data: { source: 'server_logs' }, missingReason: 'no_correlated_server_logs' }], true) : fresh\n })\n if (!saved.success)\n return saved\n const files = await attachments(report.id)\n if (!files.success)\n return files\n const reasons = await reldb.sql.get<{ count: number }>(`SELECT COUNT(*) AS count FROM ${table.evidence} WHERE report_id = ? AND kind = 'missing'`, [report.id])\n if (!reasons.success)\n return reasons\n const partial = Number(reasons.data?.count ?? 0) > 0 || files.data.some(item => item.status !== 'available')\n const updated = await withLease(job, tx => tx.execute(`UPDATE ${table.reports} SET collection_status = ?, updated_at = ${clock} WHERE id = ?`, [partial ? 'partial' : 'complete', report.id]))\n return updated.success ? ok({ collected: captured.length }) : updated\n }\n if (job.kind === 'notify') {\n if (config.notificationMode === 'disabled')\n return ok({ disabled: true })\n const recipient = 'recipient' in payload && typeof payload.recipient === 'string' ? payload.recipient : ''\n if (config.notificationMode === 'reach' && !config.recipients.includes(recipient))\n return invalid()\n // 受理通知与补采独立;发送前以数据库租约和存活报告再次确认副作用资格。\n const live = await withLease(job, tx => access(report.id, actor, undefined, tx))\n if (!live.success)\n return live\n const current = repo.report(live.data)\n if (config.notificationMode === 'console') {\n core.logger.info('Feedback notification', { module: 'feedback', number: current.number, appId: current.appId, summary: current.summary, collectionStatus: current.collectionStatus })\n return ok({ channel: 'console' })\n }\n const { HaiReachError, reach } = await import('@h-ai/reach')\n const materialStatus = {\n collecting: feedbackM('feedback_materialCollecting'),\n complete: feedbackM('feedback_materialComplete'),\n partial: feedbackM('feedback_materialPartial'),\n failed: feedbackM('feedback_materialFailed'),\n }[current.collectionStatus]\n const detailUrl = config.adminUrl ? new URL(config.adminUrl) : undefined\n detailUrl?.searchParams.set('feedback', report.id)\n const facts = [current.number, `${current.appId} ${current.appVersion ?? ''}`, `${feedbackM('feedback_submittedAt')}: ${new Date(current.createdAt).toISOString()}`, `${feedbackM('feedback_materialStatus')}: ${materialStatus}`, current.summary ?? '', ...(detailUrl ? [detailUrl.href] : [])]\n const isEmail = reach.config?.providers.find(provider => provider.name === config.notificationProvider)?.type === 'smtp'\n const body = isEmail ? facts.map(value => `<p>${escapeHtml(value)}</p>`).join('') : facts.join('\\n')\n const sent = await reach.send({ provider: config.notificationProvider, to: recipient, subject: `${feedbackM('feedback_received')} ${current.number}`, body, idempotencyKey: job.id, deferPolicy: 'reject' })\n if (!sent.success && sent.error.code === HaiReachError.DND_BLOCKED.code)\n return ok({ pending: true, deferred: true })\n if (!sent.success)\n return sent\n if (!sent.data.success)\n return failed()\n if (sent.data.deferred) {\n return err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n }\n return ok({ messageId: sent.data.messageId ?? '' })\n }\n if (job.kind === 'export') {\n if (!('report' in payload) || !('evidence' in payload) || !('attachments' in payload))\n return invalid()\n const fixed = payload as { report: FeedbackReport, evidence: FeedbackEvidence[], history: FeedbackHistory[], attachments: FeedbackAttachmentRow[], snapshotExpiresAt: number }\n if (fixed.snapshotExpiresAt < Date.now())\n return missing()\n const files: Array<{ id: string, name: string, contentType: string, checksum: string, bytes: Uint8Array }> = []\n const unavailable = fixed.attachments.filter(file => file.status !== 'available').map(file => `attachment:${file.client_id}:${file.status}`).sort()\n let total = Buffer.byteLength(JSON.stringify(fixed.evidence))\n for (const file of fixed.attachments) {\n if (file.status !== 'available')\n continue\n const stored = await storage.file.get(file.object_key)\n if (!stored.success)\n return stored\n if (hash(stored.data) !== file.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n total += stored.data.length\n if (total > 64 * 1024 * 1024)\n return limited()\n const info = attachmentData(file)\n files.push({ id: info.id, name: info.name, contentType: info.contentType, checksum: info.checksum, bytes: stored.data })\n }\n const bundle = await createFeedbackBundle({ maxBytes: budget.maxTotalBytes, report: fixed.report, evidence: fixed.evidence, history: fixed.history, attachments: files, missing: unavailable })\n if (!bundle.success)\n return bundle\n const key = `feedback/${hash(report.scopeId).slice(0, 16)}/${report.id}/exports/${job.id}-${job.token}.zip`\n const stored = await storage.file.put(key, bundle.data, { contentType: 'application/zip', ifNoneMatch: '*' })\n return stored.success ? ok({ key, checksum: hash(bundle.data), size: bundle.data.length }) : stored\n }\n const marked = await withLease(job, async (tx) => {\n const locked = await repo.find(report.id, report.scopeId, tx)\n if (!locked.success)\n return locked\n if (!locked.data)\n return missing()\n const active = await tx.get<{ count: number }>(`SELECT COUNT(*) AS count FROM ${table.jobs} WHERE report_id = ? AND kind = 'export' AND status IN ('pending', 'running')`, [report.id])\n if (!active.success)\n return active\n if (Number(active.data?.count ?? 0) > 0)\n return conflict()\n const updated = await tx.execute(`UPDATE ${table.reports} SET deleting = 1 WHERE id = ? AND expires_at <= ${clock}`, [report.id])\n if (!updated.success)\n return updated\n return updated.data.changes || Number(locked.data.deleting) ? ok(undefined) : conflict()\n })\n if (!marked.success)\n return marked\n const cleared = await storage.dir.delete(prefix)\n if (!cleared.success)\n return cleared\n const deleted = await withLease(job, async (tx) => {\n for (const name of [table.evidence, table.attachments, table.history]) {\n const removed = await tx.execute(`DELETE FROM ${name} WHERE report_id = ?`, [report.id])\n if (!removed.success)\n return removed\n }\n const removedJobs = await tx.execute(`DELETE FROM ${table.jobs} WHERE report_id = ? AND id <> ?`, [report.id, job.id])\n if (!removedJobs.success)\n return removedJobs\n // 仅保留一天最小清扫墓碑,重试删除可能在响应丢失或旧进程退出时迟到的对象。\n const tombstone = await tx.execute(`UPDATE ${table.jobs} SET payload = ?, result = NULL WHERE id = ? AND token = ?`, [JSON.stringify({ tombstone: true, prefix, until: Date.now() + 86400000 }), job.id, job.token])\n if (!tombstone.success)\n return tombstone\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('id', report.id, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const removed = await tx.execute(`DELETE FROM ${table.reports} WHERE ${identity} AND expires_at <= ${clock}`, params)\n return removed.success ? ok({ pending: true }) : removed\n })\n return deleted\n }\n\n return operations\n}\n\nfunction allowedContentType(type: string) {\n return ['image/png', 'image/jpeg', 'image/webp', 'video/webm', 'video/mp4', 'text/plain', 'application/json', 'application/pdf'].includes(type)\n}\nfunction matchesContentType(bytes: Buffer, type: string) {\n if (type === 'image/png')\n return bytes.length >= 24 && bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])) && bytes.readUInt32BE(16) * bytes.readUInt32BE(20) <= 32 * 1024 * 1024\n if (type === 'image/jpeg')\n return bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255\n if (type === 'image/webp')\n return bytes.subarray(0, 4).toString() === 'RIFF' && bytes.subarray(8, 12).toString() === 'WEBP'\n if (type === 'application/pdf')\n return bytes.subarray(0, 5).toString() === '%PDF-'\n if (type === 'video/webm')\n return bytes.length >= 12 && bytes.subarray(0, 4).equals(Buffer.from([0x1A, 0x45, 0xDF, 0xA3]))\n if (type === 'video/mp4')\n return bytes.length >= 12 && bytes.subarray(4, 8).toString() === 'ftyp'\n if (type === 'application/json') {\n try {\n JSON.parse(bytes.toString('utf8'))\n return true\n }\n catch {\n return false\n }\n }\n return type === 'text/plain' && !bytes.includes(0)\n}\n","import type { FeedbackConfigInput } from './feedback-config.js'\nimport type { FeedbackRuntime } from './feedback-functions.js'\nimport type { FeedbackFunctions } from './feedback-types.js'\nimport { resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { storage } from '@h-ai/storage'\nimport { createFeedbackCapture } from './feedback-capture.js'\nimport { FeedbackConfigSchema } from './feedback-config.js'\nimport { createFeedbackOperations } from './feedback-functions.js'\nimport { feedbackM } from './feedback-i18n.js'\nimport { FeedbackReportRepository } from './feedback-repository.js'\nimport { HaiFeedbackError } from './feedback-types.js'\n\nconst notInitialized = core.module.createNotInitializedKit(HaiFeedbackError.NOT_INITIALIZED, () => feedbackM('feedback_notInitialized'))\nconst unavailable = notInitialized.proxy<FeedbackRuntime>()\nlet current: { operations: FeedbackRuntime, capture: ReturnType<typeof createFeedbackCapture>, config: ReturnType<typeof FeedbackConfigSchema.parse> } | null = null\nlet generation = 0\nlet initializing = false\nconst inFlight = new Set<Promise<unknown>>()\n\n/**\n * Feedback 生命周期与公共操作入口;依赖由应用初始化并在 feedback 关闭后释放。\n * @example\n * ```ts\n * import { feedback } from '@h-ai/feedback'\n *\n * // 宿主先初始化 reldb、storage、reach,并在反馈关闭后释放依赖。\n * async function collectFeedback() {\n * const initialized = await feedback.init({ appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' })\n * if (!initialized.success) return initialized\n * try {\n * return await feedback.submit({ appId: 'orders', submissionId: 'stable-submission' }, { scopeId: 'tenant-1', userId: 'user-1' })\n * } finally {\n * await feedback.close()\n * }\n * }\n * void collectFeedback\n * ```\n */\nexport const feedback: FeedbackFunctions = {\n async init(config: FeedbackConfigInput) {\n if (initializing)\n return err(HaiFeedbackError.INIT_IN_PROGRESS, feedbackM('feedback_initInProgress'))\n initializing = true\n const epoch = ++generation\n let candidateCapture: ReturnType<typeof createFeedbackCapture> | undefined\n try {\n const parsed = FeedbackConfigSchema.safeParse(config)\n if (!parsed.success)\n return configFailure(parsed.error.issues.map(issue => issue.path.join('.')))\n if (!reldb.isInitialized || !storage.isInitialized)\n return configFailure([!reldb.isInitialized ? 'reldb' : 'storage'])\n if (parsed.data.notificationMode === 'reach') {\n const provider = await import('@h-ai/reach').catch(() => undefined)\n if (!provider)\n return configFailure(['reach'])\n const { reach } = provider\n if (!reach.isInitialized)\n return configFailure(['reach'])\n if (!reach.config?.providers.some(provider => provider.name === parsed.data.notificationProvider))\n return configFailure(['notificationProvider'])\n }\n if (current) {\n const previous = current\n current = null\n await Promise.allSettled([...inFlight])\n await previous.operations.close()\n await previous.capture.close()\n }\n const repository = new FeedbackReportRepository()\n const ready = await repository.ready()\n if (!ready.success)\n return ready\n if (epoch !== generation)\n return notInitialized.result()\n candidateCapture = createFeedbackCapture(parsed.data.appId, parsed.data.envAllowlist, { appVersion: parsed.data.appVersion, buildId: parsed.data.buildId, commit: parsed.data.commit })\n const operations = createFeedbackOperations(repository, parsed.data, candidateCapture)\n if (epoch !== generation) {\n await operations.close()\n await candidateCapture.close()\n return notInitialized.result()\n }\n current = { operations, capture: candidateCapture, config: parsed.data }\n operations.start()\n core.logger.info('Feedback module initialized', { module: 'feedback', appId: parsed.data.appId })\n return ok(undefined)\n }\n catch {\n if (candidateCapture)\n await candidateCapture.close()\n return err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n }\n finally {\n initializing = false\n }\n },\n async close() {\n generation++\n const previous = current\n current = null\n await Promise.allSettled([...inFlight])\n if (!previous)\n return ok(undefined)\n try {\n await previous.operations.close()\n await previous.capture.close()\n return ok(undefined)\n }\n catch {\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n }\n },\n get isInitialized() {\n return current !== null\n },\n get config() {\n return current ? { ...current.config, recipients: [...current.config.recipients], envAllowlist: [...current.config.envAllowlist] } : null\n },\n get budget() {\n return resolveFeedbackBudget(current?.config)\n },\n submit: (input, actor) => guarded(() => (current?.operations ?? unavailable).submit(input, actor)),\n list: (input, actor) => guarded(() => (current?.operations ?? unavailable).list(input, actor)),\n get: (id, actor) => guarded(() => (current?.operations ?? unavailable).get(id, actor)),\n getEvidence: (input, actor) => guarded(() => (current?.operations ?? unavailable).getEvidence(input, actor)),\n setStatus: (input, actor) => guarded(() => (current?.operations ?? unavailable).setStatus(input, actor)),\n appendEvidence: (input, actor) => guarded(() => (current?.operations ?? unavailable).appendEvidence(input, actor)),\n completeCollection: (input, actor) => guarded(() => (current?.operations ?? unavailable).completeCollection(input, actor)),\n uploadAttachment: (input, actor) => guarded(() => (current?.operations ?? unavailable).uploadAttachment(input, actor)),\n getAttachment: (input, actor) => guarded(() => (current?.operations ?? unavailable).getAttachment(input, actor)),\n retry: (input, actor) => guarded(() => (current?.operations ?? unavailable).retry(input, actor)),\n export: (input, actor) => guarded(() => (current?.operations ?? unavailable).export(input, actor)),\n getExport: (input, actor) => guarded(() => (current?.operations ?? unavailable).getExport(input, actor)),\n runJobs: () => guarded(() => (current?.operations ?? unavailable).runJobs()),\n}\n\nfunction configFailure(fields: string[]) {\n return { success: false as const, error: { ...HaiFeedbackError.CONFIG_ERROR, message: feedbackM('feedback_configError'), ext: { module: 'feedback', fields } } }\n}\n\nasync function guarded<T>(work: () => Promise<import('@h-ai/core').HaiResult<T>>) {\n const promise = core.context.run({ suppressLogObservers: true }, work)\n inFlight.add(promise)\n try {\n return await promise\n }\n catch {\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n }\n finally {\n inFlight.delete(promise)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/feedback-config.ts","../src/feedback-repository.ts","../src/feedback-sanitize.ts","../src/feedback-capture.ts","../src/feedback-clock.ts","../src/feedback-functions.ts","../src/feedback-main.ts"],"names":["core","current","reldb","key","missing","err","createHash","ok","FeedbackEvidenceInputSchema","bytes","Buffer","randomUUID","updated","capacity","cleared","unavailable","stored","removed","storage","provider","resolveFeedbackBudget"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod'\n\n/**\n * Feedback 服务端配置,不包含依赖模块凭据;连接由宿主初始化。\n * @example\n * ```ts\n * import { FeedbackConfigSchema } from '@h-ai/feedback'\n * const config = FeedbackConfigSchema.parse({ appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' })\n * void config.retentionDays\n * ```\n */\nexport const FeedbackConfigSchema = z.strictObject({\n /** 反馈所属应用标识;应与浏览器及 API 入口配置一致。 */\n appId: z.string().min(1).max(128),\n /** 当前应用版本,作为默认诊断信息保存。 */\n appVersion: z.string().max(128).optional(),\n /** 构建标识,帮助定位发布产物。 */\n buildId: z.string().max(128).optional(),\n /** 源码提交标识,帮助定位对应代码。 */\n commit: z.string().max(128).optional(),\n /** disabled 不通知,console 默认仅输出元数据,reach 使用已有通知通道。 */\n notificationMode: z.enum(['disabled', 'console', 'reach']).default('reach'),\n /** console 通知内容;metadata 只输出定位和采集状态,summary 显式加入通用脱敏摘要。 */\n consoleContent: z.enum(['metadata', 'summary']).default('metadata'),\n /** Reach 接收方,由实际 Provider 校验邮箱、手机号或业务目的地。 */\n recipients: z.array(z.string().min(1).max(320)).max(20).default([]),\n /** 已初始化 Reach Provider 的唯一名称,不限制为邮件。 */\n notificationProvider: z.string().min(1).default('email'),\n /** 管理员通知中的反馈管理页面地址。 */\n adminUrl: z.url().refine(value => ['http:', 'https:'].includes(new URL(value).protocol)).optional(),\n /** 补充材料收集超时,单位毫秒;超时后冻结为完整或部分材料。 */\n collectionTimeoutMs: z.number().int().min(0).max(300000).default(60000),\n /** 业务 collectEvidence 异步回调的等待上限,单位毫秒;超时后重试采集任务。 */\n businessCollectionTimeoutMs: z.number().int().min(1).max(300000).default(30000),\n /** 反馈采集结束后的 Webhook 地址;空字符串禁用,只允许可信 HTTP(S) 地址且不跟随重定向。 */\n webhookUrl: z.string().max(2048).refine((value) => {\n if (!value)\n return true\n if (!URL.canParse(value))\n return false\n const url = new URL(value)\n return ['http:', 'https:'].includes(url.protocol) && !url.username && !url.password && !url.hash\n }).default(''),\n /** Webhook HMAC-SHA256 签名密钥;空字符串不签名,仅服务端私有环境配置。 */\n webhookSecret: z.string().max(4096).default(''),\n /** 单次 Webhook 请求超时,单位毫秒;非 2xx 或超时均进入持久重试。 */\n webhookTimeoutMs: z.number().int().min(1).max(60000).default(10000),\n /** 持久任务扫描间隔,单位毫秒;零值由宿主手动运行任务。 */\n workerIntervalMs: z.number().int().min(0).max(60000).default(1000),\n /** 持久任务执行租约时长,单位毫秒;过期后允许其他实例接管。 */\n leaseMs: z.number().int().min(1000).max(300000).default(30000),\n /** 汇集、通知、Webhook 和导出任务最大尝试次数;到期清理持续重试。 */\n maxAttempts: z.number().int().min(1).max(20).default(5),\n /** 已受理反馈及对象附件的保留天数。 */\n retentionDays: z.number().int().min(1).max(3650).default(30),\n /** 允许采集的服务端环境变量名;凭据类名称仍按敏感信息策略排除。 */\n envAllowlist: z.array(z.string().min(1).max(128)).max(100).default([]),\n /** 未压缩导出总预算;客户端、附件总量和传输预算由此派生。 */\n maxTotalBytes: z.number().int().min(4 * 1024 * 1024).max(40 * 1024 * 1024).default(32 * 1024 * 1024),\n /** 单个附件允许的最大字节数;同时受总预算约束。 */\n maxAttachmentBytes: z.number().int().min(1).max(5 * 1024 * 1024).default(5 * 1024 * 1024),\n /** 单份反馈累计证据允许的最大字节数。 */\n maxEvidenceBytes: z.number().int().min(1024).max(4 * 1024 * 1024).default(4 * 1024 * 1024),\n /** 单份反馈累计证据允许的最大条数。 */\n maxEvidenceCount: z.number().int().min(1).max(10000).default(2000),\n}).superRefine((config, context) => {\n if (config.notificationMode === 'reach' && !config.recipients.length)\n context.addIssue({ code: 'custom', path: ['recipients'], message: 'Reach recipients are required' })\n})\n\n/**\n * 已校验服务端配置,默认项均已补齐。\n * @example\n * ```ts\n * import type { FeedbackConfig } from '@h-ai/feedback'\n * function describeRetention(config: FeedbackConfig) { return `${config.appId}: ${config.retentionDays} days` }\n * void describeRetention\n * ```\n */\nexport type FeedbackConfig = z.infer<typeof FeedbackConfigSchema>\n/**\n * 服务端输入配置,默认项可省略。\n * @example\n * ```ts\n * import type { FeedbackConfigInput } from '@h-ai/feedback'\n * const config: FeedbackConfigInput = { appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' }\n * void config\n * ```\n */\nexport type FeedbackConfigInput = z.input<typeof FeedbackConfigSchema>\n","import type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, DmlWithTxOperations, ReldbTableDef } from '@h-ai/reldb'\nimport { FeedbackReportSchema } from '@h-ai/api-contract/feedback'\nimport { err, ok } from '@h-ai/core'\nimport { BaseReldbCrudRepository, reldb } from '@h-ai/reldb'\nimport { feedbackM } from './feedback-i18n.js'\nimport { HaiFeedbackError } from './feedback-types.js'\n\n// 表与列只能来自本模块静态定义,所有动态值均使用参数绑定。\nconst REPORTS = 'hai_feedback_reports'\nconst EVIDENCE = 'hai_feedback_evidence'\nconst ATTACHMENTS = 'hai_feedback_attachments'\nconst HISTORY = 'hai_feedback_history'\nconst JOBS = 'hai_feedback_jobs'\n\n// 仅允许本模块静态身份列;不能把外部输入拼成 SQL 标识符。\nconst identityColumns = ['id', 'report_id', 'scope_id', 'app_id', 'user_id', 'source', 'request_id', 'error_id', 'client_id'] as const\n\n/**\n * 内部身份等值条件:保留索引预筛,并在 MySQL 中排除 CI/PAD SPACE 排序规则的别名。\n * 参数在生成占位符时一并追加,避免方言差异导致绑定错位。\n * @example 模块内部上下文\n * ```ts\n * const params: unknown[] = []\n * const condition = feedbackTextEquals('scope_id', 'tenant-A', params)\n * void condition\n * ```\n */\nexport function feedbackTextEquals(column: typeof identityColumns[number], value: string, params: unknown[]): string {\n if (!identityColumns.includes(column))\n throw new Error('Invalid feedback identity column')\n params.push(value)\n if (reldb.config?.type !== 'mysql')\n return `${column} = ?`\n params.push(value)\n return `(${column} = ? AND CAST(${column} AS BINARY) = CAST(? AS BINARY))`\n}\n\nconst reportDef: ReldbTableDef = {\n id: { type: 'TEXT', primaryKey: true },\n scope_id: { type: 'TEXT', notNull: true },\n user_id: { type: 'TEXT', notNull: true },\n app_id: { type: 'TEXT', notNull: true },\n number: { type: 'TEXT', notNull: true },\n app_version: { type: 'TEXT' },\n summary: { type: 'TEXT', notNull: true },\n submission_key: { type: 'TEXT', notNull: true, unique: true },\n submission_hash: { type: 'TEXT', notNull: true },\n status: { type: 'TEXT', notNull: true },\n collection_status: { type: 'TEXT', notNull: true },\n notification_status: { type: 'TEXT', notNull: true },\n created_at: { type: 'BIGINT', notNull: true },\n updated_at: { type: 'BIGINT', notNull: true },\n version: { type: 'INTEGER', notNull: true },\n revision: { type: 'INTEGER', notNull: true },\n evidence_count: { type: 'INTEGER', notNull: true },\n evidence_bytes: { type: 'BIGINT', notNull: true },\n collect_deadline: { type: 'BIGINT', notNull: true },\n expires_at: { type: 'BIGINT', notNull: true },\n payload: { type: 'JSON', notNull: true },\n deleting: { type: 'INTEGER', notNull: true },\n}\n\n/**\n * 内部持久记录;payload 使用 JSON 以容纳跨数据库的长描述。\n * @example 模块内部上下文\n * ```ts\n * function reportIdentity(row: FeedbackReportRow) { return { id: row.id, scopeId: row.scope_id } }\n * void reportIdentity\n * ```\n */\nexport interface FeedbackReportRow {\n id: string\n scope_id: string\n user_id: string\n app_id: string\n number: string\n app_version: string | null\n summary: string\n submission_key: string\n submission_hash: string\n status: string\n collection_status: string\n notification_status: string\n created_at: number\n updated_at: number\n version: number\n revision: number\n evidence_count: number\n evidence_bytes: number\n collect_deadline: number\n expires_at: number\n payload: unknown\n deleting: number\n}\n\n/**\n * 内部任务行;租约与正文不通过公开 API 泄漏。\n * @example 模块内部上下文\n * ```ts\n * function ownedJob(row: FeedbackJobRow, token: string) { return row.status === 'running' && row.token === token }\n * void ownedJob\n * ```\n */\nexport interface FeedbackJobRow {\n id: string\n app_id: string\n snapshot_revision: number | null\n snapshot_version: number | null\n report_id: string\n scope_id: string\n kind: 'collect' | 'notify' | 'webhook' | 'export' | 'cleanup'\n status: 'pending' | 'running' | 'succeeded' | 'failed'\n token: string | null\n lease_until: number\n attempts: number\n next_run_at: number\n created_at: number\n updated_at: number\n last_error: string | null\n payload: unknown\n result: unknown\n}\n\n/**\n * 内部证据行,单条结构化事件保持可分页/按请求定位。\n * @example 模块内部上下文\n * ```ts\n * function eventPosition(row: FeedbackEvidenceRow) { return `${row.source}:${row.sequence}` }\n * void eventPosition\n * ```\n */\nexport interface FeedbackEvidenceRow {\n id: string\n report_id: string | null\n scope_id: string\n user_id: string\n app_id: string\n source: string\n sequence: number\n kind: string\n timestamp: number\n request_id: string | null\n error_id: string | null\n revision: number\n bytes: number\n expires_at: number\n payload: unknown\n}\n\n/**\n * 内部附件行,客户端永远不能指定 object_key。\n * @example 模块内部上下文\n * ```ts\n * function availableObject(row: FeedbackAttachmentRow) { return row.status === 'available' ? row.object_key : null }\n * void availableObject\n * ```\n */\nexport interface FeedbackAttachmentRow {\n id: string\n client_id: string\n report_id: string\n scope_id: string\n object_key: string\n status: 'pending' | 'available' | 'failed'\n size: number\n checksum: string\n updated_at: number\n payload: unknown\n}\n\n/**\n * 数据库返回 JSON 在各驱动间可能为文本或对象,集中归一化。\n * @example 模块内部上下文\n * ```ts\n * const decoded = readFeedbackJson('{\"status\":\"pending\"}')\n * void decoded\n * ```\n */\nexport function readFeedbackJson(value: unknown): unknown {\n return typeof value === 'string' ? JSON.parse(value) : value\n}\n\n/**\n * 内部仓库,沿用框架建表屏障;SQL 只用于跨实体事务和条件提交。\n * @example 模块内部上下文\n * ```ts\n * async function findReport(id: string, scopeId: string) {\n * const repository = new FeedbackReportRepository()\n * const ready = await repository.ready()\n * return ready.success ? repository.find(id, scopeId) : ready\n * }\n * void findReport\n * ```\n */\nexport class FeedbackReportRepository extends BaseReldbCrudRepository<FeedbackReportRow> {\n readonly tables = { reports: REPORTS, evidence: EVIDENCE, attachments: ATTACHMENTS, history: HISTORY, jobs: JOBS }\n\n constructor() {\n super(reldb, {\n table: REPORTS,\n fields: Object.entries(reportDef).map(([name, def]) => ({ fieldName: name, columnName: name, def, select: true, create: true, update: name !== 'id' })),\n })\n }\n\n async ready(): Promise<HaiResult<void>> {\n const report = await this.ensureReady()\n if (!report.success)\n return report\n const definitions: Array<[string, ReldbTableDef]> = [\n [EVIDENCE, {\n id: { type: 'TEXT', primaryKey: true },\n report_id: { type: 'TEXT' },\n scope_id: { type: 'TEXT', notNull: true },\n user_id: { type: 'TEXT', notNull: true },\n app_id: { type: 'TEXT', notNull: true },\n source: { type: 'TEXT', notNull: true },\n sequence: { type: 'BIGINT', notNull: true },\n kind: { type: 'TEXT', notNull: true },\n timestamp: { type: 'BIGINT', notNull: true },\n request_id: { type: 'TEXT' },\n error_id: { type: 'TEXT' },\n revision: { type: 'INTEGER', notNull: true },\n bytes: { type: 'INTEGER', notNull: true },\n expires_at: { type: 'BIGINT', notNull: true },\n payload: { type: 'JSON', notNull: true },\n }],\n [ATTACHMENTS, {\n id: { type: 'TEXT', primaryKey: true },\n client_id: { type: 'TEXT', notNull: true },\n report_id: { type: 'TEXT', notNull: true },\n scope_id: { type: 'TEXT', notNull: true },\n object_key: { type: 'TEXT', notNull: true },\n status: { type: 'TEXT', notNull: true },\n size: { type: 'BIGINT', notNull: true },\n checksum: { type: 'TEXT', notNull: true },\n updated_at: { type: 'BIGINT', notNull: true },\n payload: { type: 'JSON', notNull: true },\n }],\n [HISTORY, { id: { type: 'TEXT', primaryKey: true }, report_id: { type: 'TEXT', notNull: true }, payload: { type: 'JSON', notNull: true } }],\n [JOBS, {\n id: { type: 'TEXT', primaryKey: true },\n app_id: { type: 'TEXT', notNull: true },\n snapshot_revision: { type: 'INTEGER' },\n snapshot_version: { type: 'INTEGER' },\n report_id: { type: 'TEXT', notNull: true },\n scope_id: { type: 'TEXT', notNull: true },\n kind: { type: 'TEXT', notNull: true },\n status: { type: 'TEXT', notNull: true },\n token: { type: 'TEXT' },\n lease_until: { type: 'BIGINT', notNull: true },\n attempts: { type: 'INTEGER', notNull: true },\n next_run_at: { type: 'BIGINT', notNull: true },\n created_at: { type: 'BIGINT', notNull: true },\n updated_at: { type: 'BIGINT', notNull: true },\n last_error: { type: 'TEXT' },\n payload: { type: 'JSON', notNull: true },\n result: { type: 'JSON' },\n }],\n ]\n for (const [table, definition] of definitions) {\n const created = await reldb.ddl.createTable(table, definition)\n if (!created.success)\n return created\n }\n const indexes = [\n { table: REPORTS, name: 'hai_feedback_reports_scope_time', columns: ['scope_id', 'created_at'] },\n { table: REPORTS, name: 'hai_feedback_reports_scope_status', columns: ['scope_id', 'status', 'created_at'] },\n { table: EVIDENCE, name: 'hai_feedback_evidence_report_seq', columns: ['report_id', 'source', 'sequence'] },\n { table: EVIDENCE, name: 'hai_feedback_evidence_temp_scope', columns: ['scope_id', 'user_id', 'timestamp'] },\n { table: ATTACHMENTS, name: 'hai_feedback_attachments_report', columns: ['report_id'] },\n { table: HISTORY, name: 'hai_feedback_history_report', columns: ['report_id'] },\n { table: JOBS, name: 'hai_feedback_jobs_pending', columns: ['app_id', 'status', 'next_run_at'] },\n { table: JOBS, name: 'hai_feedback_jobs_snapshot', columns: ['report_id', 'snapshot_revision', 'snapshot_version'] },\n ]\n for (const index of indexes) {\n // MySQL 的 CREATE INDEX 不支持 IF NOT EXISTS;重启和多节点启动须核验真实索引定义。\n const inspect = async (): Promise<HaiResult<boolean>> => {\n const found = await reldb.sql.query<{ column_name: string, non_unique: number }>('SELECT COLUMN_NAME AS column_name, NON_UNIQUE AS non_unique FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ? ORDER BY SEQ_IN_INDEX', [index.table, index.name])\n if (!found.success)\n return found\n if (!found.data.length)\n return ok(false)\n const matches = found.data.length === index.columns.length && found.data.every((column, position) => column.column_name === index.columns[position] && Number(column.non_unique) === 1)\n return matches ? ok(true) : err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n }\n if (reldb.config?.type === 'mysql') {\n const existing = await inspect()\n if (!existing.success)\n return existing\n if (existing.data)\n continue\n }\n const result = await reldb.ddl.createIndex(index.table, index.name, { columns: index.columns })\n if (!result.success) {\n // 两个进程可能同时观察到缺失;仅另一进程已建立完全一致的索引才视为完成。\n if (reldb.config?.type === 'mysql') {\n const concurrent = await inspect()\n if (concurrent.success && concurrent.data)\n continue\n }\n return result\n }\n }\n return ok(undefined)\n }\n\n async find(id: string, scope: string, sql: DmlOperations = reldb.sql) {\n const lock = sql !== reldb.sql && reldb.config?.type !== 'sqlite' ? ' FOR UPDATE' : ''\n const params: unknown[] = []\n const condition = `${feedbackTextEquals('id', id, params)} AND ${feedbackTextEquals('scope_id', scope, params)}`\n const result = await sql.get<FeedbackReportRow>(`SELECT * FROM ${REPORTS} WHERE ${condition}${lock}`, params)\n return result.success && result.data && (result.data.id !== id || result.data.scope_id !== scope) ? ok(null) : result\n }\n\n report(row: FeedbackReportRow) {\n return FeedbackReportSchema.parse({\n ...FeedbackReportSchema.parse(readFeedbackJson(row.payload)),\n status: row.status,\n collectionStatus: row.collection_status,\n notificationStatus: row.notification_status,\n updatedAt: Number(row.updated_at),\n version: Number(row.version),\n evidenceRevision: Number(row.revision),\n })\n }\n\n /** 显式事务逐步检查 HaiResult;业务失败也执行 rollback。 */\n async transaction<T>(work: (tx: DmlWithTxOperations) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n const begun = await reldb.tx.begin()\n if (!begun.success)\n return begun\n try {\n const result = await work(begun.data)\n if (!result.success) {\n const rollback = await begun.data.rollback()\n return rollback.success ? result : rollback\n }\n const committed = await begun.data.commit()\n return committed.success ? result : committed\n }\n catch {\n await begun.data.rollback()\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n }\n }\n}\n","import { core } from '@h-ai/core'\nimport { redactFeedbackText } from './feedback-sanitize-text.js'\n\nexport { redactFeedbackText } from './feedback-sanitize-text.js'\n\n/**\n * JSON 安全拷贝,避免原对象被异步采集修改;各字符串同样执行凭证脱敏。\n * @example 模块内部上下文\n * ```ts\n * const evidence = sanitizeFeedbackValue({ message: 'failure', password: 'discard-me' })\n * void evidence\n * ```\n */\nexport function sanitizeFeedbackValue(value: unknown): unknown {\n const sanitized = core.sanitize.sanitizeSensitiveFields(value)\n return JSON.parse(JSON.stringify(sanitized, (_key, item: unknown) => {\n if (typeof item === 'bigint')\n return item.toString()\n if (typeof item === 'string') {\n if (/^https?:\\/\\//i.test(item))\n return core.sanitize.sanitizeUrl(item)\n return redactFeedbackText(item)\n }\n return item\n }))\n}\n\n/**\n * 稳定提交摘要:相同内容的字段顺序不影响幂等性。\n * @example 模块内部上下文\n * ```ts\n * const first = canonicalFeedbackJson({ b: 2, a: 1 })\n * const same = first === canonicalFeedbackJson({ a: 1, b: 2 })\n * void same\n * ```\n */\nexport function canonicalFeedbackJson(value: unknown): string {\n if (Array.isArray(value))\n return `[${value.map(canonicalFeedbackJson).join(',')}]`\n if (value && typeof value === 'object') {\n return `{${Object.entries(value).filter(([, item]) => item !== undefined).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonicalFeedbackJson(item)}`).join(',')}}`\n }\n return JSON.stringify(value) ?? 'null'\n}\n","import type { FeedbackEvidenceInput } from '@h-ai/api-contract/feedback'\nimport type { LogRecord } from '@h-ai/core'\nimport { Buffer } from 'node:buffer'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { arch, platform, release, totalmem } from 'node:os'\nimport process from 'node:process'\nimport { FeedbackEvidenceInputSchema } from '@h-ai/api-contract/feedback'\nimport { core } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { feedbackTextEquals, readFeedbackJson } from './feedback-repository.js'\nimport { sanitizeFeedbackValue } from './feedback-sanitize.js'\n\n/**\n * 绑定可信身份的内部日志副本,字节数用于有界缓存。\n * @example 模块内部上下文\n * ```ts\n * const record: CapturedRecord = { event: { id: 'entry', source: 'server:test', sequence: 1, kind: 'log', timestamp: 1, data: {} }, scopeId: 'tenant', userId: 'user', bytes: 1 }\n * void record.bytes\n * ```\n */\ninterface CapturedRecord { event: FeedbackEvidenceInput, scopeId: string, userId: string, bytes: number }\n\n/**\n * Node 现场观察器,只保留有可信身份上下文的有界日志。\n * @example 模块内部上下文\n * ```ts\n * function startAfterDependencies() {\n * const capture = createFeedbackCapture('orders', [], {})\n * return capture.close()\n * }\n * ```\n */\nexport function createFeedbackCapture(appId: string, envAllowlist: string[], service: { appVersion?: string, buildId?: string, commit?: string }) {\n const source = `server:${randomUUID()}`\n const buffer: CapturedRecord[] = []\n const pending = new Map<string, CapturedRecord>()\n const windows = new Map<string, { errorId: string, after: number, deadline: number }>()\n const losses = new Map<string, CapturedRecord>()\n let capacityLoss: FeedbackEvidenceInput | undefined\n let sequence = 0\n let totalBytes = 0\n let stopped = false\n let flushing: Promise<void> | null = null\n\n async function flush(): Promise<void> {\n if (flushing)\n return flushing\n flushing = core.context.run({ suppressLogObservers: true }, async () => {\n // 队列自身最多 3000 条日志和 200 条缺失标记;一次补采须排空当前快照。\n for (const [key, item] of [...pending]) {\n const current = await reldb.sql.get('SELECT id FROM hai_feedback_evidence WHERE id = ?', [key])\n if (!current.success) {\n rememberLoss(item, 'server_temporary_evidence_write_failed')\n return\n }\n if (!current.data) {\n const event = item.event\n const result = await reldb.sql.execute('INSERT INTO hai_feedback_evidence (id, report_id, scope_id, user_id, app_id, source, sequence, kind, timestamp, request_id, error_id, revision, bytes, expires_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [key, null, item.scopeId, item.userId, appId, event.source, event.sequence, event.kind, event.timestamp, event.requestId ?? null, event.errorId ?? null, 1, item.bytes, Date.now() + 5 * 60000, JSON.stringify(event)])\n if (!result.success) {\n rememberLoss(item, 'server_temporary_evidence_write_failed')\n return\n }\n }\n pending.delete(key)\n }\n }).finally(() => {\n flushing = null\n })\n return flushing\n }\n\n function rememberLoss(item: Pick<CapturedRecord, 'scopeId' | 'userId'> & { event?: FeedbackEvidenceInput, requestId?: string }, reason: string) {\n for (const [key, previous] of losses) {\n if (previous.event.timestamp < Date.now() - 5 * 60000) {\n losses.delete(key)\n pending.delete(createHash('sha256').update(`${source}:${previous.event.sequence}`).digest('hex'))\n }\n }\n if (capacityLoss && capacityLoss.timestamp < Date.now() - 5 * 60000)\n capacityLoss = undefined\n const requestId = item.requestId ?? item.event?.requestId\n const key = JSON.stringify([item.scopeId, item.userId, requestId, reason])\n if (losses.has(key))\n return\n const event: FeedbackEvidenceInput = { id: randomUUID(), source, sequence: sequence++, kind: 'missing', timestamp: Date.now(), requestId, data: { source: 'server_logs' }, missingReason: reason }\n if (losses.size >= 200) {\n // 元数据容量耗尽时保留一个不含身份信息的稳定降级标记。\n capacityLoss ??= { ...event, requestId: undefined, missingReason: 'server_capture_capacity_exceeded' }\n return\n }\n const entry = { event, scopeId: item.scopeId, userId: item.userId, bytes: Buffer.byteLength(JSON.stringify(event)) }\n losses.set(key, entry)\n pending.set(createHash('sha256').update(`${source}:${event.sequence}`).digest('hex'), entry)\n }\n\n function pin(item: CapturedRecord, errorId: string) {\n if (item.event.kind === 'error')\n item.event.errorId = item.event.id\n else item.event.errorId ??= errorId\n const key = createHash('sha256').update(`${source}:${item.event.sequence}`).digest('hex')\n if (pending.has(key))\n return\n if (pending.size >= 3000) {\n rememberLoss(item, 'server_pending_evidence_overflow')\n return\n }\n // 日志首次归属后不再改变 payload;重叠窗口复用同一条临时证据。\n const event = { ...item.event }\n pending.set(key, { ...item, event })\n }\n\n function observe(record: LogRecord) {\n if (stopped || record.context.module === 'feedback')\n return\n const { scopeId, userId, requestId } = record.context\n if (typeof scopeId !== 'string' || typeof userId !== 'string' || typeof requestId !== 'string')\n return\n const value = sanitizeFeedbackValue({ message: record.message, level: record.level, context: record.context })\n const event = FeedbackEvidenceInputSchema.parse({ id: randomUUID(), source, sequence: sequence++, kind: record.level === 'error' || record.level === 'fatal' ? 'error' : 'log', timestamp: record.timestamp, requestId, data: value })\n const bytes = Buffer.byteLength(JSON.stringify(event))\n if (bytes > 65536) {\n rememberLoss({ scopeId, userId, requestId }, 'server_log_record_too_large')\n return\n }\n const item = { event, scopeId, userId, bytes }\n const key = JSON.stringify([scopeId, userId, requestId])\n const previous = windows.get(key)\n if (previous) {\n if (previous.deadline >= Date.now() && previous.after < 100) {\n pin(item, previous.errorId)\n previous.after++\n }\n else {\n windows.delete(key)\n }\n }\n if (event.kind === 'error') {\n for (const [windowKey, window] of windows) {\n if (window.deadline < Date.now())\n windows.delete(windowKey)\n }\n for (const before of buffer.filter(entry => entry.scopeId === scopeId && entry.userId === userId && entry.event.requestId === requestId).slice(-100)) pin(before, event.id)\n pin(item, event.id)\n if (windows.has(key) || windows.size < 100)\n windows.set(key, { errorId: event.id, after: 0, deadline: Date.now() + 30000 })\n else rememberLoss(item, 'server_error_window_overflow')\n }\n buffer.push(item)\n totalBytes += bytes\n while (buffer.length > 10000 || totalBytes > 16 * 1024 * 1024 || (buffer[0]?.event.timestamp ?? Date.now()) < Date.now() - 5 * 60000) {\n const removed = buffer.shift()\n totalBytes -= removed?.bytes ?? 0\n if (removed && removed.event.timestamp >= Date.now() - 5 * 60000)\n rememberLoss(removed, 'server_log_buffer_overflow')\n }\n }\n\n const stop = core.logger.observe(observe)\n const timer = setInterval(() => {\n void flush().catch(() => undefined)\n }, 250)\n timer.unref()\n return {\n async collect(scopeId: string, userId: string, anchor: number) {\n await flush()\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('app_id', appId, params)} AND ${feedbackTextEquals('scope_id', scopeId, params)} AND ${feedbackTextEquals('user_id', userId, params)}`\n params.push(anchor - 5 * 60000, anchor + 30000)\n const persisted = await reldb.sql.query<{ payload: unknown }>(`SELECT payload FROM hai_feedback_evidence WHERE report_id IS NULL AND ${identity} AND timestamp >= ? AND timestamp <= ? ORDER BY timestamp DESC, source DESC, sequence DESC LIMIT 1001`, params)\n if (!persisted.success)\n rememberLoss({ scopeId, userId }, 'server_temporary_evidence_read_failed')\n else if (persisted.data.length > 1000)\n rememberLoss({ scopeId, userId }, 'server_evidence_truncated')\n const events = new Map<string, FeedbackEvidenceInput>()\n const saved = persisted.success\n ? persisted.data.slice(0, 1000).reverse().flatMap((row) => {\n try {\n const parsed = FeedbackEvidenceInputSchema.safeParse(readFeedbackJson(row.payload))\n if (parsed.success)\n return [parsed.data]\n }\n catch {\n // 临时记录损坏时保留其他可用证据,缺失标记不包含原始数据库内容。\n }\n rememberLoss({ scopeId, userId }, 'server_temporary_evidence_invalid')\n return []\n })\n : []\n for (const event of saved) {\n const key = `${event.source}:${event.sequence}`\n if (!events.has(key))\n events.set(key, event.kind === 'error' ? { ...event, errorId: event.id } : event)\n }\n const pinnedRequests = new Set([...events.values()].filter(item => item.errorId).map(item => item.requestId))\n const local = buffer.filter(item => item.scopeId === scopeId && item.userId === userId && item.event.timestamp >= anchor - 5 * 60000 && item.event.timestamp <= anchor + 30000)\n const before = local.filter(item => item.event.timestamp <= anchor).slice(-100)\n const after = local.filter(item => item.event.timestamp > anchor).slice(0, 100)\n for (const item of [...before, ...after]) {\n if (!pinnedRequests.has(item.event.requestId))\n events.set(`${item.event.source}:${item.event.sequence}`, item.event)\n }\n for (const [key, item] of losses) {\n if (item.event.timestamp < Date.now() - 5 * 60000) {\n losses.delete(key)\n continue\n }\n if (item.scopeId === scopeId && item.userId === userId && item.event.timestamp >= anchor - 5 * 60000)\n events.set(`${item.event.source}:${item.event.sequence}`, item.event)\n }\n if (capacityLoss && capacityLoss.timestamp >= anchor - 5 * 60000)\n events.set(`${capacityLoss.source}:${capacityLoss.sequence}`, capacityLoss)\n if (events.size > 1000) {\n rememberLoss({ scopeId, userId }, 'server_evidence_truncated')\n const marker = losses.get(JSON.stringify([scopeId, userId, undefined, 'server_evidence_truncated']))?.event\n if (marker)\n events.set(`${marker.source}:${marker.sequence}`, marker)\n }\n const missing = [...events.values()].filter(item => item.kind === 'missing').slice(-1000)\n const logs = [...events.values()].filter(item => item.kind !== 'missing').sort((a, b) => a.timestamp - b.timestamp)\n const allowance = 1000 - missing.length\n return [...allowance > 0 ? logs.slice(-allowance) : [], ...missing].sort((a, b) => a.timestamp - b.timestamp)\n },\n environment(): FeedbackEvidenceInput {\n const env = Object.fromEntries(envAllowlist.filter(key => !core.sanitize.defaultSensitiveKeyRegex.test(key.replace(/([a-z])([A-Z])/g, '$1_$2'))).map(key => [key, process.env[key] ?? null]))\n return FeedbackEvidenceInputSchema.parse({ id: randomUUID(), source, sequence: sequence++, kind: 'environment', timestamp: Date.now(), data: sanitizeFeedbackValue({ appId, service, os: { platform: platform(), release: release(), arch: arch() }, runtime: { name: 'node', version: process.version, uptimeSeconds: Math.floor(process.uptime()), memoryBytes: process.memoryUsage().rss, totalMemoryBytes: totalmem() }, environment: env }) })\n },\n async close() {\n stopped = true\n stop()\n clearInterval(timer)\n await flush()\n },\n }\n}\n\n/**\n * 内部现场采集生命周期句柄。\n * @example 模块内部上下文\n * ```ts\n * function stopCapture(capture: FeedbackCapture) { return capture.close() }\n * ```\n */\nexport type FeedbackCapture = ReturnType<typeof createFeedbackCapture>\n","import { reldb } from '@h-ai/reldb'\n\n/**\n * 租约条件在数据库真正执行时取时钟,避免工作节点时差及行锁等待跨过截止时间。\n * @example 模块内部上下文\n * ```ts\n * const condition = `lease_until > ${feedbackClockSql()}`\n * void condition\n * ```\n */\nexport function feedbackClockSql(): string {\n if (reldb.config?.type === 'postgresql')\n return '(FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000)::bigint)'\n if (reldb.config?.type === 'mysql')\n return '(CAST(UNIX_TIMESTAMP(SYSDATE(3)) * 1000 AS UNSIGNED))'\n return '(CAST((julianday(\\'now\\') - 2440587.5) * 86400000 AS INTEGER))'\n}\n","import type { FeedbackAttachment, FeedbackEvidence, FeedbackEvidenceInput, FeedbackHistory, FeedbackJob, FeedbackReport } from '@h-ai/api-contract/feedback'\nimport type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, DmlWithTxOperations } from '@h-ai/reldb'\nimport type { FeedbackCapture } from './feedback-capture.js'\nimport type { FeedbackConfig } from './feedback-config.js'\nimport type { FeedbackAttachmentRow, FeedbackEvidenceRow, FeedbackJobRow, FeedbackReportRepository, FeedbackReportRow } from './feedback-repository.js'\nimport type { FeedbackCollectedEvidence, FeedbackContext, FeedbackFunctions, FeedbackInitOptions, FeedbackWebhookEvent } from './feedback-types.js'\nimport { Buffer } from 'node:buffer'\nimport { createHash, createHmac, randomUUID } from 'node:crypto'\nimport {\n FeedbackAppendEvidenceInputSchema,\n FeedbackAttachmentInputSchema,\n FeedbackAttachmentSchema,\n FeedbackCompleteInputSchema,\n FeedbackEvidenceInputSchema,\n FeedbackEvidenceQuerySchema,\n FeedbackEvidenceSchema,\n FeedbackExportInputSchema,\n FeedbackHistorySchema,\n FeedbackJobSchema,\n FeedbackListInputSchema,\n FeedbackRetryInputSchema,\n FeedbackSetStatusInputSchema,\n FeedbackSubmitInputSchema,\n FeedbackUploadInputSchema,\n resolveFeedbackBudget,\n} from '@h-ai/api-contract/feedback'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { storage } from '@h-ai/storage'\nimport { createFeedbackBundle } from './bundle/index.js'\nimport { feedbackClockSql } from './feedback-clock.js'\nimport { feedbackM } from './feedback-i18n.js'\nimport { feedbackTextEquals, readFeedbackJson } from './feedback-repository.js'\nimport { canonicalFeedbackJson, redactFeedbackText, sanitizeFeedbackValue } from './feedback-sanitize.js'\nimport { HaiFeedbackError } from './feedback-types.js'\n\n/**\n * 内部运行时,任务资源由模块生命周期停止。\n * @example 模块内部上下文\n * ```ts\n * async function drain(runtime: FeedbackRuntime) { await runtime.close() }\n * void drain\n * ```\n */\nexport type FeedbackRuntime = Omit<FeedbackFunctions, 'init' | 'close' | 'config' | 'budget' | 'isInitialized'> & { start: () => void, close: () => Promise<void> }\n\n/** 将异常留在公共 HaiResult 边界之内;不向用户返回 SDK/SQL/凭据原文。 */\nfunction failed() {\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n}\nfunction invalid() {\n return err(HaiFeedbackError.INVALID_INPUT, feedbackM('feedback_invalidInput'))\n}\nfunction conflict() {\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_conflict'))\n}\nfunction forbidden() {\n return err(HaiFeedbackError.FORBIDDEN, feedbackM('feedback_forbidden'))\n}\nfunction missing() {\n return err(HaiFeedbackError.NOT_FOUND, feedbackM('feedback_notFound'))\n}\nfunction limited() {\n return err(HaiFeedbackError.LIMIT_EXCEEDED, feedbackM('feedback_limitExceeded'))\n}\nfunction hash(value: string | Uint8Array) {\n return createHash('sha256').update(value).digest('hex')\n}\nfunction permitted(actor: FeedbackContext, permission: string) {\n return actor.permissions?.includes('feedback:*') || actor.permissions?.includes(permission)\n}\nfunction validActor(actor: FeedbackContext) {\n return !!actor && typeof actor.scopeId === 'string' && actor.scopeId.length > 0 && actor.scopeId.length <= 128 && typeof actor.userId === 'string' && actor.userId.length > 0 && actor.userId.length <= 128\n}\nfunction escapeHtml(value: string) {\n return value.replace(/[&<>\"']/g, character => ({ '&': '&', '<': '<', '>': '>', '\"': '"', '\\'': ''' })[character] ?? character)\n}\n\n/**\n * 服务端操作编排,数据表/存储/通知均使用依赖的公开入口。\n * @example 模块内部上下文\n * ```ts\n * function createRuntime(repository: FeedbackReportRepository, config: FeedbackConfig, capture: FeedbackCapture) {\n * return createFeedbackOperations(repository, config, capture)\n * }\n * void createRuntime\n * ```\n */\nexport function createFeedbackOperations(repo: FeedbackReportRepository, config: FeedbackConfig, capture: FeedbackCapture, options: FeedbackInitOptions = {}): FeedbackRuntime {\n const budget = resolveFeedbackBudget(config)\n const table = repo.tables\n const clock = feedbackClockSql()\n let stopped = false\n let timer: ReturnType<typeof setTimeout> | undefined\n let running: Promise<HaiResult<{ processed: number }>> | null = null\n const shutdown = new AbortController()\n const collectEvidence = options.collectEvidence\n\n async function access(id: string, actor: FeedbackContext, permission?: string, sql: DmlOperations = reldb.sql): Promise<HaiResult<FeedbackReportRow>> {\n if (!validActor(actor))\n return forbidden()\n const result = await repo.find(id, actor.scopeId, sql)\n if (!result.success)\n return result\n if (!result.data || result.data.id !== id || result.data.scope_id !== actor.scopeId || result.data.app_id !== config.appId || Number(result.data.deleting))\n return missing()\n if (permission ? !permitted(actor, permission) : (result.data.user_id !== actor.userId && !permitted(actor, 'feedback:read')))\n return forbidden()\n return ok(result.data)\n }\n\n async function accessWrite(id: string, actor: FeedbackContext, sql: DmlOperations = reldb.sql) {\n const result = await access(id, actor, permitted(actor, 'feedback:process') ? 'feedback:process' : undefined, sql)\n if (!result.success)\n return result\n return result.data.user_id === actor.userId || permitted(actor, 'feedback:process') ? result : forbidden()\n }\n\n async function insertJob(tx: DmlOperations, report: FeedbackReport, kind: FeedbackJobRow['kind'], suffix: string, payload: unknown, nextRun: number) {\n const id = hash(`${report.id}:${kind}:${suffix}`)\n const previous = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE id = ?`, [id])\n if (!previous.success)\n return previous\n if (previous.data)\n return ok(id)\n const now = Date.now()\n const inserted = await tx.execute(`INSERT INTO ${table.jobs} (id, app_id, snapshot_revision, snapshot_version, report_id, scope_id, kind, status, token, lease_until, attempts, next_run_at, created_at, updated_at, last_error, payload, result) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ${clock} + ?, ?, ?, ?, ?, ?)`, [id, config.appId, kind === 'export' ? report.evidenceRevision : null, kind === 'export' ? report.version : null, report.id, report.scopeId, kind, 'pending', null, 0, 0, Math.max(0, nextRun - now), now, now, null, JSON.stringify(payload), null])\n return inserted.success ? ok(id) : inserted\n }\n\n function jobData(row: FeedbackJobRow): FeedbackJob {\n const result = readFeedbackJson(row.result)\n return FeedbackJobSchema.parse({ id: row.id, feedbackId: row.report_id, type: row.kind, status: row.status, attempts: Number(row.attempts), createdAt: Number(row.created_at), updatedAt: Number(row.updated_at), nextRunAt: Number(row.next_run_at), lastError: row.last_error ?? undefined, result: result && typeof result === 'object' ? { available: true } : undefined })\n }\n\n function attachmentData(row: FeedbackAttachmentRow): FeedbackAttachment {\n return FeedbackAttachmentSchema.parse({ ...FeedbackAttachmentSchema.parse(readFeedbackJson(row.payload)), status: row.status })\n }\n\n async function appendInside(tx: DmlWithTxOperations, row: FeedbackReportRow, events: FeedbackEvidenceInput[], internal = false): Promise<HaiResult<{ acknowledged: string[], evidenceRevision: number }>> {\n const acknowledged: string[] = []\n const additions: Array<{ key: string, event: FeedbackEvidenceInput, bytes: number }> = []\n for (const input of events) {\n if (!internal && input.source.startsWith('server:'))\n return invalid()\n const event = FeedbackEvidenceInputSchema.parse(sanitizeFeedbackValue(input))\n const key = hash(`${row.id}:${event.source}:${event.sequence}`)\n const previous = await tx.get<FeedbackEvidenceRow>(`SELECT * FROM ${table.evidence} WHERE id = ?`, [key])\n if (!previous.success)\n return previous\n if (previous.data) {\n if (canonicalFeedbackJson(readFeedbackJson(previous.data.payload)) !== canonicalFeedbackJson(event))\n return conflict()\n }\n else {\n const bytes = Buffer.byteLength(JSON.stringify(event))\n if (bytes > 1024 * 1024)\n return limited()\n const staged = additions.find(item => item.key === key)\n if (staged && canonicalFeedbackJson(staged.event) !== canonicalFeedbackJson(event))\n return conflict()\n if (!staged)\n additions.push({ key, event, bytes })\n }\n acknowledged.push(event.id)\n }\n if (!additions.length)\n return ok({ acknowledged, evidenceRevision: Number(row.revision) })\n const bytes = additions.reduce((total, item) => total + item.bytes, 0)\n const revision = Number(row.revision) + 1\n const params: unknown[] = [additions.length, bytes, revision, Date.now()]\n const identity = `${feedbackTextEquals('id', row.id, params)} AND ${feedbackTextEquals('scope_id', row.scope_id, params)}`\n params.push(row.revision, additions.length, budget.maxEvidenceCount, bytes, budget.maxEvidenceBytes)\n const changed = await tx.execute(`UPDATE ${table.reports} SET evidence_count = evidence_count + ?, evidence_bytes = evidence_bytes + ?, revision = ?, updated_at = ? WHERE ${identity} AND revision = ? AND deleting = 0 AND evidence_count + ? <= ? AND evidence_bytes + ? <= ?`, params)\n if (!changed.success)\n return changed\n if (!changed.data.changes)\n return Number(row.evidence_count) + additions.length > budget.maxEvidenceCount || Number(row.evidence_bytes) + bytes > budget.maxEvidenceBytes ? limited() : conflict()\n for (const { key, event, bytes: itemBytes } of additions) {\n const inserted = await tx.execute(`INSERT INTO ${table.evidence} (id, report_id, scope_id, user_id, app_id, source, sequence, kind, timestamp, request_id, error_id, revision, bytes, expires_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [key, row.id, row.scope_id, row.user_id, row.app_id, event.source, event.sequence, event.kind, event.timestamp, event.requestId ?? null, event.errorId ?? null, revision, itemBytes, row.expires_at, JSON.stringify(event)])\n if (!inserted.success)\n return inserted\n }\n return ok({ acknowledged, evidenceRevision: revision })\n }\n\n async function appendInternal(id: string, actor: FeedbackContext, events: FeedbackEvidenceInput[]) {\n return repo.transaction(async (tx) => {\n const row = await access(id, actor, undefined, tx)\n return row.success ? appendInside(tx, row.data, events, true) : row\n })\n }\n\n async function attachments(id: string, sql: DmlOperations = reldb.sql) {\n return sql.query<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE report_id = ? ORDER BY id`, [id])\n }\n async function withLease<T>(job: FeedbackJobRow, work: (tx: DmlWithTxOperations) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n return repo.transaction(async (tx) => {\n const lock = reldb.config?.type === 'sqlite' ? '' : ' FOR UPDATE'\n const owned = await tx.get(`SELECT id FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}${lock}`, [job.id, job.token])\n if (!owned.success)\n return owned\n if (!owned.data)\n return conflict()\n const result = await work(tx)\n if (!result.success)\n return result\n const stillOwned = await tx.get(`SELECT id FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [job.id, job.token])\n return stillOwned.success && stillOwned.data ? result : conflict()\n })\n }\n\n async function notificationSummary(id: string) {\n if (config.notificationMode === 'disabled')\n return reldb.sql.execute(`UPDATE ${table.reports} SET notification_status = 'disabled' WHERE id = ?`, [id])\n return reldb.sql.execute(`UPDATE ${table.reports} SET notification_status = CASE\n WHEN EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND (status = 'failed' OR last_error IS NOT NULL)) THEN 'failed'\n WHEN NOT EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND status <> 'succeeded') THEN 'sent'\n WHEN EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND status = 'running') THEN 'sending'\n WHEN EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'notify' AND status = 'pending' AND result IS NOT NULL) THEN 'deferred'\n ELSE 'pending' END WHERE id = ?`, [id, id, id, id, id])\n }\n async function history(id: string, sql: DmlOperations = reldb.sql) {\n const result = await sql.query<{ payload: unknown }>(`SELECT payload FROM ${table.history} WHERE report_id = ? ORDER BY id`, [id])\n return result.success ? ok(result.data.map(row => FeedbackHistorySchema.parse(readFeedbackJson(row.payload)))) : result\n }\n async function evidence(id: string, revision: number, sql: DmlOperations = reldb.sql) {\n const result = await sql.query<FeedbackEvidenceRow>(`SELECT * FROM ${table.evidence} WHERE report_id = ? AND revision <= ? ORDER BY timestamp, source, sequence`, [id, revision])\n return result.success ? ok(result.data.map(row => FeedbackEvidenceSchema.parse({ ...FeedbackEvidenceInputSchema.parse(readFeedbackJson(row.payload)), feedbackId: id, revision: Number(row.revision) }))) : result\n }\n\n const operations: FeedbackRuntime = {\n start() {\n if (!config.workerIntervalMs || stopped)\n return\n const tick = async () => {\n if (stopped)\n return\n await operations.runJobs()\n if (!stopped) {\n timer = setTimeout(() => {\n void tick()\n }, config.workerIntervalMs)\n timer.unref()\n }\n }\n timer = setTimeout(() => {\n void tick()\n }, config.workerIntervalMs)\n timer.unref()\n },\n async close() {\n stopped = true\n shutdown.abort()\n if (timer)\n clearTimeout(timer)\n await running\n },\n\n async submit(input, actor) {\n if (!validActor(actor))\n return forbidden()\n if (actor.permissions !== undefined && !permitted(actor, 'feedback:create'))\n return forbidden()\n const parsed = FeedbackSubmitInputSchema.safeParse(input)\n if (!parsed.success || parsed.data.appId !== config.appId)\n return invalid()\n const sanitized = FeedbackSubmitInputSchema.parse(sanitizeFeedbackValue(parsed.data))\n const submissionKey = hash(JSON.stringify([actor.scopeId, actor.userId, config.appId, sanitized.submissionId]))\n const digest = hash(canonicalFeedbackJson(sanitized))\n const existing = await reldb.sql.get<FeedbackReportRow>(`SELECT * FROM ${table.reports} WHERE submission_key = ?`, [submissionKey])\n if (!existing.success)\n return existing\n if (existing.data && (existing.data.scope_id !== actor.scopeId || existing.data.user_id !== actor.userId || existing.data.app_id !== config.appId))\n return conflict()\n if (existing.data && Number(existing.data.deleting))\n return missing()\n if (existing.data)\n return existing.data.submission_hash === digest ? ok(repo.report(existing.data)) : conflict()\n const now = Date.now()\n const id = `fb_${randomUUID()}`\n const report: FeedbackReport = {\n id,\n number: `FB-${new Date(now).toISOString().slice(0, 10).replaceAll('-', '')}-${id.slice(-8).toUpperCase()}`,\n appId: config.appId,\n scopeId: actor.scopeId,\n userId: actor.userId,\n description: sanitized.description,\n category: sanitized.category,\n contact: sanitized.contact,\n url: sanitized.url,\n summary: (sanitized.description?.trim() || sanitized.url || feedbackM('feedback_defaultSummary')).slice(0, 200),\n appVersion: sanitized.appVersion ?? config.appVersion,\n buildId: sanitized.buildId ?? config.buildId,\n commit: sanitized.commit ?? config.commit,\n status: 'pending',\n collectionStatus: 'collecting',\n notificationStatus: config.notificationMode === 'disabled' ? 'disabled' : 'pending',\n createdAt: now,\n updatedAt: now,\n version: 1,\n evidenceRevision: 1,\n }\n const row: FeedbackReportRow = { id, scope_id: actor.scopeId, user_id: actor.userId, app_id: config.appId, number: report.number, app_version: report.appVersion ?? null, summary: report.summary ?? '', submission_key: submissionKey, submission_hash: digest, status: 'pending', collection_status: 'collecting', notification_status: report.notificationStatus, created_at: now, updated_at: now, version: 1, revision: 1, evidence_count: 0, evidence_bytes: 0, collect_deadline: now + config.collectionTimeoutMs, expires_at: now + config.retentionDays * 86400000, payload: report, deleting: 0 }\n const result = await repo.transaction(async (tx) => {\n const inserted = await repo.create({ ...row }, tx)\n if (!inserted.success)\n return inserted\n const initial = await appendInside(tx, row, sanitized.evidence ?? [])\n if (!initial.success)\n return initial\n if ((sanitized.attachments ?? []).reduce((total, file) => total + file.size, 0) > budget.maxAttachmentsBytes)\n return limited()\n for (const attachment of sanitized.attachments ?? []) {\n if (attachment.id.startsWith('server:') || attachment.size > budget.maxAttachmentBytes || !allowedContentType(attachment.contentType))\n return invalid()\n const attachmentId = hash(`${id}:${attachment.id}`)\n const data: FeedbackAttachment = { ...attachment, feedbackId: id, status: 'pending' }\n const saved = await tx.execute(`INSERT INTO ${table.attachments} (id, client_id, report_id, scope_id, object_key, status, size, checksum, updated_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [attachmentId, attachment.id, id, actor.scopeId, `feedback/${hash(actor.scopeId).slice(0, 16)}/${id}/${attachmentId}`, 'pending', attachment.size, attachment.checksum, now, JSON.stringify(data)])\n if (!saved.success)\n return saved\n }\n for (const recipient of config.notificationMode === 'disabled' ? [] : config.notificationMode === 'console' ? ['console'] : config.recipients) {\n const saved = await insertJob(tx, report, 'notify', recipient, { recipient }, row.collect_deadline)\n if (!saved.success)\n return saved\n }\n if (config.webhookUrl) {\n const webhook = await insertJob(tx, report, 'webhook', 'created', { url: config.webhookUrl }, row.collect_deadline)\n if (!webhook.success)\n return webhook\n }\n const collected = await insertJob(tx, report, 'collect', 'initial', { anchor: sanitized.anchor?.timestamp ?? now, businessEvidence: !!collectEvidence }, row.collect_deadline)\n if (!collected.success)\n return collected\n const cleanup = await insertJob(tx, report, 'cleanup', 'expiry', {}, row.expires_at)\n if (!cleanup.success)\n return cleanup\n return ok({ ...report, evidenceRevision: initial.data.evidenceRevision })\n })\n if (!result.success) {\n const duplicate = await reldb.sql.get<FeedbackReportRow>(`SELECT * FROM ${table.reports} WHERE submission_key = ?`, [submissionKey])\n if (!duplicate.success || !duplicate.data)\n return result\n if (duplicate.data.scope_id !== actor.scopeId || duplicate.data.user_id !== actor.userId || duplicate.data.app_id !== config.appId)\n return conflict()\n if (Number(duplicate.data.deleting))\n return missing()\n return duplicate.data.submission_hash === digest ? ok(repo.report(duplicate.data)) : conflict()\n }\n const environment = await appendInternal(id, actor, [capture.environment()])\n // 已可靠受理后补采失败不会伪装为未受理;后台任务继续补齐并标明状态。\n if (!environment.success)\n core.logger.warn('Feedback environment collection deferred', { module: 'feedback', feedbackId: id })\n const current = await repo.find(id, actor.scopeId)\n return current.success && current.data ? ok(repo.report(current.data)) : result\n },\n\n async list(input, actor) {\n if (!validActor(actor) || !permitted(actor, 'feedback:read'))\n return forbidden()\n const parsed = FeedbackListInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const query = parsed.data\n if (query.from !== undefined && query.to !== undefined && query.from > query.to)\n return invalid()\n const params: unknown[] = []\n const conditions = [feedbackTextEquals('scope_id', actor.scopeId, params), feedbackTextEquals('app_id', config.appId, params), 'deleting = 0']\n for (const [column, value] of [['status', query.status], ['collection_status', query.collectionStatus], ['notification_status', query.notificationStatus], ['app_id', query.appId]] as const) {\n if (value) {\n if (column === 'app_id') {\n conditions.push(feedbackTextEquals(column, value, params))\n }\n else {\n conditions.push(`${column} = ?`)\n params.push(value)\n }\n }\n }\n if (query.from !== undefined) {\n conditions.push('created_at >= ?')\n params.push(query.from)\n }\n if (query.to !== undefined) {\n conditions.push('created_at <= ?')\n params.push(query.to)\n }\n // 用独立的短摘要列执行跨数据库筛选,不扫描诊断 JSON 大字段。\n if (query.search) {\n conditions.push('(number LIKE ? ESCAPE \\'!\\' OR summary LIKE ? ESCAPE \\'!\\')')\n const search = `%${query.search.replaceAll('!', '!!').replaceAll('%', '!%').replaceAll('_', '!_')}%`\n params.push(search, search)\n }\n if (query.appVersion) {\n conditions.push('app_version = ?')\n params.push(query.appVersion)\n }\n const direction = query.sortDirection === 'asc' ? 'ASC' : 'DESC'\n const page = await reldb.sql.queryPage<FeedbackReportRow>({ sql: `SELECT * FROM ${table.reports} WHERE ${conditions.join(' AND ')} ORDER BY created_at ${direction}, id ${direction}`, params, pagination: { page: query.page, pageSize: query.pageSize } })\n return page.success ? ok({ ...page.data, items: page.data.items.map(row => repo.report(row)) }) : page\n },\n\n async get(id, actor) {\n const report = await access(id, actor)\n if (!report.success)\n return report\n const files = await attachments(id)\n if (!files.success)\n return files\n const changes = await history(id)\n if (!changes.success)\n return changes\n const jobs = await reldb.sql.query<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE report_id = ? ORDER BY created_at, id`, [id])\n return jobs.success ? ok({ report: repo.report(report.data), attachments: files.data.map(attachmentData), history: changes.data, jobs: jobs.data.map(jobData) }) : jobs\n },\n\n async getEvidence(input, actor) {\n const parsed = FeedbackEvidenceQuerySchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const accessResult = await access(parsed.data.id, actor)\n if (!accessResult.success)\n return accessResult\n const query = parsed.data\n const params: unknown[] = []\n const conditions = [feedbackTextEquals('report_id', query.id, params), feedbackTextEquals('scope_id', actor.scopeId, params)]\n for (const [column, value] of [['source', query.source], ['kind', query.kind], ['request_id', query.requestId]] as const) {\n if (value) {\n if (column === 'kind') {\n conditions.push(`${column} = ?`)\n params.push(value)\n }\n else {\n conditions.push(feedbackTextEquals(column, value, params))\n }\n }\n }\n if (query.errorId) {\n const anchorParams: unknown[] = []\n const anchorIdentity = `${feedbackTextEquals('report_id', query.id, anchorParams)} AND ${feedbackTextEquals('error_id', query.errorId, anchorParams)}`\n const anchor = await reldb.sql.get<FeedbackEvidenceRow>(`SELECT * FROM ${table.evidence} WHERE ${anchorIdentity} AND kind = 'error'`, anchorParams)\n if (!anchor.success)\n return anchor\n if (!anchor.data)\n return ok({ items: [], total: 0, page: query.page ?? 1, pageSize: query.pageSize ?? 20 })\n const contextParams: unknown[] = []\n const contextIdentity = `${feedbackTextEquals('report_id', query.id, contextParams)} AND ${feedbackTextEquals('source', anchor.data.source, contextParams)}`\n const request = anchor.data.request_id ? feedbackTextEquals('request_id', anchor.data.request_id, contextParams) : 'request_id IS NULL'\n const before = await reldb.sql.query<{ id: string }>(`SELECT id FROM ${table.evidence} WHERE ${contextIdentity} AND ${request} AND kind IN ('log', 'error') AND sequence <= ? ORDER BY sequence DESC LIMIT 101`, [...contextParams, anchor.data.sequence])\n if (!before.success)\n return before\n const after = await reldb.sql.query<{ id: string }>(`SELECT id FROM ${table.evidence} WHERE ${contextIdentity} AND ${request} AND kind IN ('log', 'error') AND sequence > ? ORDER BY sequence ASC LIMIT 100`, [...contextParams, anchor.data.sequence])\n if (!after.success)\n return after\n const ids = [...before.data, ...after.data].map(row => row.id)\n conditions.push(`id IN (${ids.map(() => '?').join(',')})`)\n params.push(...ids)\n }\n if (query.from !== undefined) {\n conditions.push('timestamp >= ?')\n params.push(query.from)\n }\n if (query.to !== undefined) {\n conditions.push('timestamp <= ?')\n params.push(query.to)\n }\n const page = await reldb.sql.queryPage<FeedbackEvidenceRow>({ sql: `SELECT * FROM ${table.evidence} WHERE ${conditions.join(' AND ')} ORDER BY timestamp, source, sequence`, params, pagination: { page: query.page, pageSize: query.pageSize } })\n return page.success ? ok({ ...page.data, items: page.data.items.map(row => FeedbackEvidenceSchema.parse({ ...FeedbackEvidenceInputSchema.parse(readFeedbackJson(row.payload)), feedbackId: query.id, revision: Number(row.revision) })) }) : page\n },\n\n async setStatus(input, actor) {\n const parsed = FeedbackSetStatusInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n return repo.transaction(async (tx) => {\n const row = await access(input.id, actor, input.status === 'handled' ? 'feedback:process' : 'feedback:reopen', tx)\n if (!row.success)\n return row\n if (Number(row.data.version) !== parsed.data.expectedVersion)\n return conflict()\n if (row.data.status === parsed.data.status)\n return ok(repo.report(row.data))\n const now = Date.now()\n const params: unknown[] = [parsed.data.status, now]\n const identity = `${feedbackTextEquals('id', input.id, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n params.push(parsed.data.expectedVersion)\n const updated = await tx.execute(`UPDATE ${table.reports} SET status = ?, version = version + 1, updated_at = ? WHERE ${identity} AND version = ?`, params)\n if (!updated.success)\n return updated\n if (!updated.data.changes)\n return conflict()\n const change: FeedbackHistory = { id: randomUUID(), feedbackId: input.id, userId: actor.userId, from: repo.report(row.data).status, to: parsed.data.status, timestamp: now, note: parsed.data.note ? redactFeedbackText(parsed.data.note) : undefined }\n const previousHistory = await history(input.id, tx)\n if (!previousHistory.success)\n return previousHistory\n if (Buffer.byteLength(JSON.stringify([...previousHistory.data, change])) > 256 * 1024)\n return limited()\n const saved = await tx.execute(`INSERT INTO ${table.history} (id, report_id, payload) VALUES (?, ?, ?)`, [change.id, input.id, JSON.stringify(change)])\n return saved.success ? ok({ ...repo.report(row.data), status: parsed.data.status, version: parsed.data.expectedVersion + 1, updatedAt: now }) : saved\n })\n },\n\n async appendEvidence(input, actor) {\n const parsed = FeedbackAppendEvidenceInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n return repo.transaction(async (tx) => {\n const row = await accessWrite(input.id, actor, tx)\n if (!row.success)\n return row\n if (Number(row.data.collect_deadline) + 5 * 60000 < Date.now())\n return conflict()\n return appendInside(tx, row.data, parsed.data.evidence)\n })\n },\n\n async completeCollection(input, actor) {\n const parsed = FeedbackCompleteInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const row = await accessWrite(input.id, actor)\n if (!row.success)\n return row\n if (parsed.data.missing?.length) {\n const saved = await appendInternal(input.id, actor, [{ id: randomUUID(), source: 'collection', sequence: Date.now(), kind: 'missing', timestamp: Date.now(), data: { missing: parsed.data.missing }, missingReason: 'collection_incomplete' }])\n if (!saved.success)\n return saved\n }\n const next = await reldb.sql.execute(`UPDATE ${table.jobs} SET next_run_at = ${clock}, updated_at = ${clock} WHERE report_id = ? AND kind IN ('collect', 'notify', 'webhook') AND status = 'pending'`, [input.id])\n return next.success ? ok(repo.report(row.data)) : next\n },\n\n async uploadAttachment(input, actor) {\n return upload(input, actor)\n },\n async getAttachment(input, actor) {\n const row = await access(input.id, actor)\n if (!row.success)\n return row\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('client_id', input.attachmentId, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const found = await reldb.sql.get<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE ${identity}`, params)\n if (!found.success)\n return found\n if (!found.data || found.data.report_id !== input.id || found.data.scope_id !== actor.scopeId || found.data.client_id !== input.attachmentId || found.data.status !== 'available')\n return missing()\n const bytes = await storage.file.get(found.data.object_key)\n if (!bytes.success)\n return bytes\n if (hash(bytes.data) !== found.data.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n const metadata = attachmentData(found.data)\n return ok({ name: metadata.name, contentType: metadata.contentType, dataBase64: bytes.data.toString('base64') })\n },\n\n async retry(input, actor) {\n const parsed = FeedbackRetryInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const permission = input.target === 'export' ? 'feedback:export' : 'feedback:process'\n const row = await access(input.id, actor, permission)\n if (!row.success)\n return row\n if (input.target === 'attachment') {\n const params: unknown[] = [Date.now()]\n const identity = `${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('client_id', input.targetId ?? '', params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const updated = await reldb.sql.execute(`UPDATE ${table.attachments} SET status = 'pending', updated_at = ? WHERE ${identity} AND status = 'failed'`, params)\n return updated.success ? ok(undefined) : updated\n }\n const updated = await reldb.sql.execute(`UPDATE ${table.jobs} SET status = 'pending', attempts = 0, next_run_at = ${clock}, last_error = NULL WHERE report_id = ? AND kind = ? AND status IN ('failed', 'pending')`, [input.id, input.target])\n if (updated.success && input.target === 'collect') {\n const resumed = await reldb.sql.execute(`UPDATE ${table.reports} SET collection_status = 'collecting' WHERE id = ? AND deleting = 0 AND EXISTS (SELECT 1 FROM ${table.jobs} WHERE report_id = ? AND kind = 'collect' AND status = 'pending')`, [input.id, input.id])\n if (!resumed.success)\n return resumed\n }\n return updated.success ? ok(undefined) : updated\n },\n\n async export(input, actor) {\n const parsed = FeedbackExportInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n return repo.transaction(async (tx) => {\n const row = await access(input.id, actor, 'feedback:export', tx)\n if (!row.success)\n return row\n const revision = parsed.data.evidenceRevision ?? Number(row.data.revision)\n if (revision > Number(row.data.revision))\n return conflict()\n const snapshotVersion = revision === Number(row.data.revision) ? ' AND snapshot_version = ?' : ''\n const previous = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE report_id = ? AND kind = 'export' AND snapshot_revision = ?${snapshotVersion} ORDER BY created_at DESC, id DESC LIMIT 1`, [input.id, revision, ...(snapshotVersion ? [row.data.version] : [])])\n if (!previous.success)\n return previous\n if (previous.data) {\n const snapshot = readFeedbackJson(previous.data.payload)\n const live = snapshot && typeof snapshot === 'object' && 'snapshotExpiresAt' in snapshot && typeof snapshot.snapshotExpiresAt === 'number' && snapshot.snapshotExpiresAt > Date.now()\n if (previous.data.status === 'succeeded' || live)\n return ok(jobData(previous.data))\n }\n if (revision < Number(row.data.revision)) {\n return missing()\n }\n const events = await evidence(input.id, revision, tx)\n if (!events.success)\n return events\n const files = await attachments(input.id, tx)\n if (!files.success)\n return files\n const changes = await history(input.id, tx)\n if (!changes.success)\n return changes\n const suffix = `${revision}:${row.data.version}${previous.data ? `:${previous.data.id}` : ''}`\n const added = await insertJob(tx, repo.report(row.data), 'export', suffix, { report: repo.report(row.data), evidence: events.data, attachments: files.data, history: changes.data, snapshotExpiresAt: Date.now() + 3600000 }, Date.now())\n if (!added.success)\n return added\n const job = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE id = ?`, [added.data])\n return job.success && job.data ? ok(jobData(job.data)) : missing()\n })\n },\n\n async getExport(input, actor) {\n const row = await access(input.id, actor, 'feedback:export')\n if (!row.success)\n return row\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('id', input.jobId, params)} AND ${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)} AND ${feedbackTextEquals('app_id', config.appId, params)}`\n const job = await reldb.sql.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE ${identity} AND kind = 'export'`, params)\n if (!job.success)\n return job\n if (!job.data)\n return missing()\n if (job.data.status === 'pending' || job.data.status === 'running') {\n const snapshot = readFeedbackJson(job.data.payload)\n if (!snapshot || typeof snapshot !== 'object' || !('snapshotExpiresAt' in snapshot) || typeof snapshot.snapshotExpiresAt !== 'number')\n return failed()\n if (snapshot.snapshotExpiresAt < Date.now())\n return missing()\n return err(HaiFeedbackError.CONFLICT, feedbackM('feedback_exportPending'))\n }\n if (job.data.status === 'failed')\n return failed()\n const data = readFeedbackJson(job.data.result)\n if (!data || typeof data !== 'object' || !('key' in data) || typeof data.key !== 'string')\n return missing()\n const bytes = await storage.file.get(data.key)\n if (!bytes.success)\n return bytes\n if (!('checksum' in data) || typeof data.checksum !== 'string' || hash(bytes.data) !== data.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n return ok({ name: `${repo.report(row.data).number}.zip`, contentType: 'application/zip', dataBase64: bytes.data.toString('base64') })\n },\n\n async runJobs() {\n if (stopped)\n return err(HaiFeedbackError.NOT_INITIALIZED, feedbackM('feedback_notInitialized'))\n if (running)\n return running\n running = core.context.run({ suppressLogObservers: true }, processJobs).catch(failed).finally(() => {\n running = null\n })\n return running\n },\n }\n\n // 附件和后台任务在同一运行时内共享受权查询与固定快照。\n async function upload(input: Parameters<FeedbackFunctions['uploadAttachment']>[0], actor: FeedbackContext): ReturnType<FeedbackFunctions['uploadAttachment']> {\n const parsed = FeedbackUploadInputSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const row = await accessWrite(input.id, actor)\n if (!row.success)\n return row\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('report_id', input.id, params)} AND ${feedbackTextEquals('client_id', input.attachmentId, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const found = await reldb.sql.get<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE ${identity}`, params)\n if (!found.success)\n return found\n if (!found.data || found.data.report_id !== input.id || found.data.scope_id !== actor.scopeId || found.data.client_id !== input.attachmentId)\n return missing()\n const attachment = found.data\n const metadata = attachmentData(attachment)\n const bytes = Buffer.from(parsed.data.dataBase64, 'base64')\n if (bytes.length !== Number(attachment.size) || bytes.length > budget.maxAttachmentBytes || !matchesContentType(bytes, metadata.contentType))\n return invalid()\n if (hash(bytes) !== attachment.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n const stored = await storage.file.put(attachment.object_key, bytes, { contentType: metadata.contentType, ifNoneMatch: '*', signal: AbortSignal.timeout(30000) })\n if (!stored.success) {\n const existing = await storage.file.get(attachment.object_key)\n if (!existing.success || hash(existing.data) !== attachment.checksum) {\n await reldb.sql.execute(`UPDATE ${table.attachments} SET status = 'failed', updated_at = ? WHERE id = ? AND status <> 'available'`, [Date.now(), attachment.id])\n return stored\n }\n }\n const updated = await repo.transaction(async (tx) => {\n const live = await accessWrite(input.id, actor, tx)\n if (!live.success)\n return live\n const currentParams: unknown[] = []\n const currentIdentity = `${feedbackTextEquals('id', attachment.id, currentParams)} AND ${feedbackTextEquals('scope_id', actor.scopeId, currentParams)}`\n const currentFile = await tx.get<FeedbackAttachmentRow>(`SELECT * FROM ${table.attachments} WHERE ${currentIdentity}`, currentParams)\n if (!currentFile.success)\n return currentFile\n if (!currentFile.data || currentFile.data.id !== attachment.id || currentFile.data.report_id !== input.id || currentFile.data.scope_id !== actor.scopeId || currentFile.data.client_id !== input.attachmentId)\n return missing()\n if (currentFile.data.status === 'available')\n return ok(undefined)\n const confirmed = await tx.execute(`UPDATE ${table.attachments} SET status = 'available', updated_at = ${clock} WHERE ${currentIdentity}`, currentParams)\n if (!confirmed.success)\n return confirmed\n if (!confirmed.data.changes)\n return conflict()\n const revised = await tx.execute(`UPDATE ${table.reports} SET revision = revision + 1, updated_at = ${clock} WHERE id = ? AND deleting = 0`, [input.id])\n return revised.success && revised.data.changes ? ok(undefined) : conflict()\n })\n if (!updated.success) {\n if (updated.error.code === HaiFeedbackError.NOT_FOUND.code)\n await storage.file.delete(attachment.object_key)\n return updated\n }\n return ok({ ...metadata, status: 'available' })\n }\n\n /** 上传与最终关联分开;只有持有租约的事务能发布材料,孤立对象由反馈到期清理回收。 */\n async function collectBusiness(job: FeedbackJobRow, report: FeedbackReport, actor: FeedbackContext): Promise<HaiResult<void>> {\n const marker = hash(`${report.id}:server:business:0`)\n const previous = await reldb.sql.get(`SELECT id FROM ${table.evidence} WHERE id = ?`, [marker])\n if (!previous.success)\n return previous\n if (previous.data)\n return ok(undefined)\n if (!collectEvidence)\n return err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n const controller = new AbortController()\n const signal = AbortSignal.any([controller.signal, shutdown.signal])\n const timeout = setTimeout(() => controller.abort(), config.businessCollectionTimeoutMs)\n timeout.unref()\n let collected: FeedbackCollectedEvidence\n let onAbort: (() => void) | undefined\n try {\n collected = await Promise.race([\n Promise.resolve().then(() => collectEvidence({ report: Object.freeze({ ...report }), signal })),\n new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(new Error('Feedback business collection aborted'))\n signal.addEventListener('abort', onAbort, { once: true })\n if (signal.aborted)\n onAbort()\n }),\n ])\n }\n catch {\n return failed()\n }\n finally {\n clearTimeout(timeout)\n if (onAbort)\n signal.removeEventListener('abort', onAbort)\n }\n if (!collected || typeof collected !== 'object' || (collected.text !== undefined && typeof collected.text !== 'string') || (collected.attachments !== undefined && !Array.isArray(collected.attachments)))\n return invalid()\n if ((collected.attachments?.length ?? 0) > budget.maxAttachmentCount)\n return limited()\n const files: Array<{ metadata: FeedbackAttachment, bytes: Buffer, key: string, rowId: string }> = []\n for (const input of collected.attachments ?? []) {\n if (!input || !(input.bytes instanceof Uint8Array) || typeof input.id !== 'string' || input.id.length > 100)\n return invalid()\n if (input.bytes.byteLength > budget.maxAttachmentBytes)\n return limited()\n let bytes = Buffer.from(input.bytes)\n if (!matchesContentType(bytes, input.contentType))\n return invalid()\n // 文本附件全文脱敏;压缩包是宿主生成的原始材料,不在服务端解压或执行。\n if (input.contentType === 'text/plain')\n bytes = Buffer.from(redactFeedbackText(bytes.toString('utf8')))\n if (input.contentType === 'application/json')\n bytes = Buffer.from(JSON.stringify(sanitizeFeedbackValue(JSON.parse(bytes.toString('utf8')))))\n if (bytes.length > budget.maxAttachmentBytes)\n return limited()\n const parsed = FeedbackAttachmentInputSchema.safeParse({ id: `server:business:${input.id}`, name: typeof input.name === 'string' ? redactFeedbackText(input.name) : input.name, contentType: input.contentType, size: bytes.length, checksum: hash(bytes) })\n if (!parsed.success || !input.id || files.some(file => file.metadata.id === parsed.data.id))\n return invalid()\n const rowId = hash(`${report.id}:${parsed.data.id}`)\n const key = `feedback/${hash(report.scopeId).slice(0, 16)}/${report.id}/business/${rowId}-${parsed.data.checksum}`\n files.push({ metadata: { ...parsed.data, feedbackId: report.id, status: 'available' }, bytes, key, rowId })\n }\n const event = FeedbackEvidenceInputSchema.safeParse(sanitizeFeedbackValue({ id: `business-${report.id}`, source: 'server:business', sequence: 0, kind: 'business', timestamp: report.createdAt, data: { ...collected.data, ...(collected.text !== undefined ? { text: collected.text } : {}), attachmentIds: files.map(file => file.metadata.id) } }))\n if (!event.success)\n return invalid()\n async function checkCapacity(sql: DmlOperations) {\n const existing = await attachments(report.id, sql)\n if (!existing.success)\n return existing\n if (existing.data.length + files.length > budget.maxAttachmentCount || existing.data.reduce((total, item) => total + Number(item.size), 0) + files.reduce((total, file) => total + file.bytes.length, 0) > budget.maxAttachmentsBytes)\n return limited()\n return ok(undefined)\n }\n const capacity = await checkCapacity(reldb.sql)\n if (!capacity.success)\n return capacity\n for (const file of files) {\n const stored = await storage.file.put(file.key, file.bytes, { contentType: file.metadata.contentType, ifNoneMatch: '*', signal: AbortSignal.any([shutdown.signal, AbortSignal.timeout(30000)]) })\n if (!stored.success) {\n const existing = await storage.file.get(file.key)\n if (!existing.success || hash(existing.data) !== file.metadata.checksum)\n return stored\n }\n }\n return withLease(job, async (tx) => {\n const fresh = await access(report.id, actor, undefined, tx)\n if (!fresh.success)\n return fresh\n const completed = await tx.get(`SELECT id FROM ${table.evidence} WHERE id = ?`, [marker])\n if (!completed.success)\n return completed\n if (completed.data)\n return ok(undefined)\n const capacity = await checkCapacity(tx)\n if (!capacity.success)\n return capacity\n const appended = await appendInside(tx, fresh.data, [event.data], true)\n if (!appended.success)\n return appended\n for (const file of files) {\n const saved = await tx.execute(`INSERT INTO ${table.attachments} (id, client_id, report_id, scope_id, object_key, status, size, checksum, updated_at, payload) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [file.rowId, file.metadata.id, report.id, actor.scopeId, file.key, 'available', file.bytes.length, file.metadata.checksum, Date.now(), JSON.stringify(file.metadata)])\n if (!saved.success)\n return saved\n }\n return ok(undefined)\n })\n }\n\n async function processJobs(): Promise<HaiResult<{ processed: number }>> {\n let processed = 0\n const candidateParams: unknown[] = []\n const appIdentity = feedbackTextEquals('app_id', config.appId, candidateParams)\n const candidates = await reldb.sql.query<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE ${appIdentity} AND ((status = 'pending' AND next_run_at <= ${clock}) OR (status = 'running' AND lease_until < ${clock})) ORDER BY next_run_at, id LIMIT 20`, candidateParams)\n if (!candidates.success)\n return candidates\n for (const job of candidates.data) {\n if (stopped)\n break\n if (job.app_id !== config.appId)\n continue\n const token = randomUUID()\n const claimParams: unknown[] = [token, config.leaseMs, job.id]\n const claimIdentity = feedbackTextEquals('app_id', config.appId, claimParams)\n const claimed = await reldb.sql.execute(`UPDATE ${table.jobs} SET status = 'running', token = ?, lease_until = ${clock} + ?, attempts = attempts + 1, updated_at = ${clock} WHERE id = ? AND ${claimIdentity} AND ((status = 'pending' AND next_run_at <= ${clock}) OR (status = 'running' AND lease_until < ${clock}))`, claimParams)\n if (!claimed.success)\n return claimed\n if (!claimed.data.changes)\n continue\n if (job.kind === 'notify')\n await notificationSummary(job.report_id)\n const renewal = setInterval(() => {\n void reldb.sql.execute(`UPDATE ${table.jobs} SET lease_until = ${clock} + ? WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [config.leaseMs, job.id, token])\n }, Math.max(250, Math.floor(config.leaseMs / 3)))\n renewal.unref()\n try {\n const result = await executeJob({ ...job, token, attempts: Number(job.attempts) + 1 })\n const pendingReceipt = result.success && !!result.data && typeof result.data === 'object' && 'pending' in result.data && result.data.pending === true\n const purged = result.success && !!result.data && typeof result.data === 'object' && 'purged' in result.data && result.data.purged === true\n const status = result.success ? pendingReceipt ? 'pending' : 'succeeded' : job.kind !== 'cleanup' && Number(job.attempts) + 1 >= config.maxAttempts ? 'failed' : 'pending'\n const saved = purged\n ? await reldb.sql.execute(`DELETE FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [job.id, token])\n : await reldb.sql.execute(`UPDATE ${table.jobs} SET status = ?, attempts = attempts - ?, token = NULL, lease_until = 0, next_run_at = ${clock} + ?, updated_at = ${clock}, last_error = ?, result = CASE WHEN ? = 1 THEN ? ELSE result END WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [status, pendingReceipt ? 1 : 0, Math.min(60000, 1000 * 2 ** Math.min(Number(job.attempts), 6)), result.success ? null : result.error.code, result.success ? 1 : 0, result.success ? JSON.stringify(result.data) : null, job.id, token])\n if (!saved.success)\n return saved\n if (saved.data.changes && status === 'failed' && job.kind === 'collect') {\n const terminal = await reldb.sql.execute(`UPDATE ${table.reports} SET collection_status = 'failed', updated_at = ${clock} WHERE id = ? AND deleting = 0 AND EXISTS (SELECT 1 FROM ${table.jobs} WHERE id = ? AND status = 'failed')`, [job.report_id, job.id])\n if (!terminal.success)\n return terminal\n }\n // 丢失租约的导出结果不能成为有效成品,补偿删除本次独立对象。\n if (!saved.data.changes && job.kind === 'export' && result.success && result.data && typeof result.data === 'object' && 'key' in result.data && typeof result.data.key === 'string')\n await storage.file.delete(result.data.key)\n if (job.kind === 'notify')\n await notificationSummary(job.report_id)\n processed++\n }\n catch {\n await reldb.sql.execute(`UPDATE ${table.jobs} SET status = ?, next_run_at = ${clock} + 60000, last_error = ?, token = NULL, lease_until = 0 WHERE id = ? AND token = ? AND lease_until > ${clock}`, [job.kind === 'cleanup' ? 'pending' : 'failed', HaiFeedbackError.OPERATION_FAILED.code, job.id, token])\n if (job.kind === 'collect')\n await reldb.sql.execute(`UPDATE ${table.reports} SET collection_status = 'failed', updated_at = ${clock} WHERE id = ? AND deleting = 0 AND EXISTS (SELECT 1 FROM ${table.jobs} WHERE id = ? AND status = 'failed')`, [job.report_id, job.id])\n }\n finally {\n clearInterval(renewal)\n }\n }\n const expired = await reldb.sql.execute(`DELETE FROM ${table.evidence} WHERE report_id IS NULL AND expires_at < ?`, [Date.now()])\n return expired.success ? ok({ processed }) : expired\n }\n\n async function executeJob(job: FeedbackJobRow): Promise<HaiResult<unknown>> {\n if (job.app_id !== config.appId)\n return missing()\n const owned = await reldb.sql.get(`SELECT id FROM ${table.jobs} WHERE id = ? AND token = ? AND status = 'running' AND lease_until > ${clock}`, [job.id, job.token])\n if (!owned.success)\n return owned\n if (!owned.data)\n return conflict()\n const raw = readFeedbackJson(job.payload)\n const payload = raw && typeof raw === 'object' ? raw : {}\n const prefix = `feedback/${hash(job.scope_id).slice(0, 16)}/${job.report_id}/`\n if (job.kind === 'cleanup' && 'tombstone' in payload && payload.tombstone === true) {\n const cleared = await storage.dir.delete(prefix)\n if (!cleared.success)\n return cleared\n return 'until' in payload && typeof payload.until === 'number' && payload.until <= Date.now() ? ok({ purged: true }) : ok({ pending: true })\n }\n const row = await repo.find(job.report_id, job.scope_id)\n if (!row.success)\n return row\n if (!row.data || row.data.id !== job.report_id || row.data.scope_id !== job.scope_id || row.data.app_id !== config.appId)\n return missing()\n if (Number(row.data.deleting) && job.kind !== 'cleanup')\n return missing()\n const report = repo.report(row.data)\n const actor: FeedbackContext = { scopeId: report.scopeId, userId: report.userId, permissions: ['feedback:*'] }\n if (job.kind === 'collect') {\n const anchor = 'anchor' in payload && typeof payload.anchor === 'number' ? payload.anchor : report.createdAt\n const captured = await capture.collect(report.scopeId, report.userId, anchor)\n const saved = await withLease(job, async (tx) => {\n const fresh = await access(report.id, actor, undefined, tx)\n return fresh.success ? appendInside(tx, fresh.data, captured.length ? captured : [{ id: `missing-server-${report.id}`, source: 'collection', sequence: 0, kind: 'missing', timestamp: report.createdAt, data: { source: 'server_logs' }, missingReason: 'no_correlated_server_logs' }], true) : fresh\n })\n if (!saved.success)\n return saved\n if ('businessEvidence' in payload && payload.businessEvidence === true) {\n const business = await collectBusiness(job, report, actor)\n if (!business.success)\n return business\n }\n const files = await attachments(report.id)\n if (!files.success)\n return files\n const reasons = await reldb.sql.get<{ count: number }>(`SELECT COUNT(*) AS count FROM ${table.evidence} WHERE report_id = ? AND kind = 'missing'`, [report.id])\n if (!reasons.success)\n return reasons\n const partial = Number(reasons.data?.count ?? 0) > 0 || files.data.some(item => item.status !== 'available')\n const updated = await withLease(job, tx => tx.execute(`UPDATE ${table.reports} SET collection_status = ?, updated_at = ${clock} WHERE id = ?`, [partial ? 'partial' : 'complete', report.id]))\n return updated.success ? ok({ collected: captured.length }) : updated\n }\n if (job.kind === 'webhook') {\n if (!('url' in payload) || payload.url !== config.webhookUrl || !config.webhookUrl)\n return err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n // 材料仍在采集中时等待,不消耗发送尝试次数;终态失败也应通知接收方。\n if (report.collectionStatus === 'collecting')\n return ok({ pending: true })\n const frozen = await withLease(job, async (tx) => {\n const live = await access(report.id, actor, undefined, tx)\n if (!live.success)\n return live\n if (live.data.collection_status === 'collecting')\n return conflict()\n const stored = await tx.get<FeedbackJobRow>(`SELECT * FROM ${table.jobs} WHERE id = ?`, [job.id])\n if (!stored.success || !stored.data)\n return missing()\n const snapshot = readFeedbackJson(stored.data.payload)\n if (snapshot && typeof snapshot === 'object' && 'body' in snapshot && typeof snapshot.body === 'string')\n return ok(snapshot.body)\n const files = await attachments(report.id, tx)\n if (!files.success)\n return files\n const business = await tx.get(`SELECT id FROM ${table.evidence} WHERE id = ?`, [hash(`${report.id}:server:business:0`)])\n if (!business.success)\n return business\n const detailUrl = config.adminUrl ? new URL(config.adminUrl) : undefined\n detailUrl?.searchParams.set('feedback', report.id)\n const event: FeedbackWebhookEvent = { event: 'feedback.created', eventId: job.id, createdAt: report.createdAt, report: repo.report(live.data), evidence: { revision: Number(live.data.revision), business: !!business.data, attachments: files.data.map(attachmentData) }, ...(detailUrl ? { detailUrl: detailUrl.href } : {}) }\n const body = JSON.stringify(event)\n const saved = await tx.execute(`UPDATE ${table.jobs} SET payload = ? WHERE id = ? AND token = ?`, [JSON.stringify({ url: config.webhookUrl, body }), job.id, job.token])\n return saved.success ? ok(body) : saved\n })\n if (!frozen.success)\n return frozen\n const timestamp = String(Math.floor(Date.now() / 1000))\n const headers: Record<string, string> = { 'content-type': 'application/json', 'idempotency-key': job.id, 'x-hai-feedback-event': 'feedback.created', 'x-hai-feedback-timestamp': timestamp }\n if (config.webhookSecret)\n headers['x-hai-feedback-signature'] = `sha256=${createHmac('sha256', config.webhookSecret).update(`${timestamp}.${frozen.data}`).digest('hex')}`\n try {\n const response = await fetch(config.webhookUrl, { method: 'POST', headers, body: frozen.data, redirect: 'manual', signal: AbortSignal.any([shutdown.signal, AbortSignal.timeout(config.webhookTimeoutMs)]) })\n await response.body?.cancel()\n return response.ok ? ok({ status: response.status }) : failed()\n }\n catch {\n return failed()\n }\n }\n if (job.kind === 'notify') {\n if (config.notificationMode === 'disabled')\n return ok({ disabled: true })\n const recipient = 'recipient' in payload && typeof payload.recipient === 'string' ? payload.recipient : ''\n if (config.notificationMode === 'reach' && !config.recipients.includes(recipient))\n return invalid()\n // 受理通知与补采独立;发送前以数据库租约和存活报告再次确认副作用资格。\n const live = await withLease(job, tx => access(report.id, actor, undefined, tx))\n if (!live.success)\n return live\n const current = repo.report(live.data)\n if (config.notificationMode === 'console') {\n core.logger.info('Feedback notification', { module: 'feedback', number: current.number, appId: current.appId, appVersion: current.appVersion, buildId: current.buildId, commit: current.commit, collectionStatus: current.collectionStatus, ...(config.consoleContent === 'summary' ? { summary: current.summary } : {}) })\n return ok({ channel: 'console' })\n }\n const { HaiReachError, reach } = await import('@h-ai/reach')\n const materialStatus = {\n collecting: feedbackM('feedback_materialCollecting'),\n complete: feedbackM('feedback_materialComplete'),\n partial: feedbackM('feedback_materialPartial'),\n failed: feedbackM('feedback_materialFailed'),\n }[current.collectionStatus]\n const detailUrl = config.adminUrl ? new URL(config.adminUrl) : undefined\n detailUrl?.searchParams.set('feedback', report.id)\n const facts = [current.number, `${current.appId} ${current.appVersion ?? ''}`, `${feedbackM('feedback_submittedAt')}: ${new Date(current.createdAt).toISOString()}`, `${feedbackM('feedback_materialStatus')}: ${materialStatus}`, current.summary ?? '', ...(detailUrl ? [detailUrl.href] : [])]\n const isEmail = reach.config?.providers.find(provider => provider.name === config.notificationProvider)?.type === 'smtp'\n const body = isEmail ? facts.map(value => `<p>${escapeHtml(value)}</p>`).join('') : facts.join('\\n')\n const sent = await reach.send({ provider: config.notificationProvider, to: recipient, subject: `${feedbackM('feedback_received')} ${current.number}`, body, idempotencyKey: job.id, deferPolicy: 'reject' })\n if (!sent.success && sent.error.code === HaiReachError.DND_BLOCKED.code)\n return ok({ pending: true, deferred: true })\n if (!sent.success)\n return sent\n if (!sent.data.success)\n return failed()\n if (sent.data.deferred) {\n return err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n }\n return ok({ messageId: sent.data.messageId ?? '' })\n }\n if (job.kind === 'export') {\n if (!('report' in payload) || !('evidence' in payload) || !('attachments' in payload))\n return invalid()\n const fixed = payload as { report: FeedbackReport, evidence: FeedbackEvidence[], history: FeedbackHistory[], attachments: FeedbackAttachmentRow[], snapshotExpiresAt: number }\n if (fixed.snapshotExpiresAt < Date.now())\n return missing()\n const files: Array<{ id: string, name: string, contentType: string, checksum: string, bytes: Uint8Array }> = []\n const unavailable = fixed.attachments.filter(file => file.status !== 'available').map(file => `attachment:${file.client_id}:${file.status}`).sort()\n let total = Buffer.byteLength(JSON.stringify(fixed.evidence))\n for (const file of fixed.attachments) {\n if (file.status !== 'available')\n continue\n const stored = await storage.file.get(file.object_key)\n if (!stored.success)\n return stored\n if (hash(stored.data) !== file.checksum)\n return err(HaiFeedbackError.CHECKSUM_MISMATCH, feedbackM('feedback_checksumMismatch'))\n total += stored.data.length\n if (total > 64 * 1024 * 1024)\n return limited()\n const info = attachmentData(file)\n files.push({ id: info.id, name: info.name, contentType: info.contentType, checksum: info.checksum, bytes: stored.data })\n }\n const bundle = await createFeedbackBundle({ maxBytes: budget.maxTotalBytes, report: fixed.report, evidence: fixed.evidence, history: fixed.history, attachments: files, missing: unavailable })\n if (!bundle.success)\n return bundle\n const key = `feedback/${hash(report.scopeId).slice(0, 16)}/${report.id}/exports/${job.id}-${job.token}.zip`\n const stored = await storage.file.put(key, bundle.data, { contentType: 'application/zip', ifNoneMatch: '*' })\n return stored.success ? ok({ key, checksum: hash(bundle.data), size: bundle.data.length }) : stored\n }\n const marked = await withLease(job, async (tx) => {\n const locked = await repo.find(report.id, report.scopeId, tx)\n if (!locked.success)\n return locked\n if (!locked.data)\n return missing()\n const active = await tx.get<{ count: number }>(`SELECT COUNT(*) AS count FROM ${table.jobs} WHERE report_id = ? AND kind = 'export' AND status IN ('pending', 'running')`, [report.id])\n if (!active.success)\n return active\n if (Number(active.data?.count ?? 0) > 0)\n return conflict()\n const updated = await tx.execute(`UPDATE ${table.reports} SET deleting = 1 WHERE id = ? AND expires_at <= ${clock}`, [report.id])\n if (!updated.success)\n return updated\n return updated.data.changes || Number(locked.data.deleting) ? ok(undefined) : conflict()\n })\n if (!marked.success)\n return marked\n const cleared = await storage.dir.delete(prefix)\n if (!cleared.success)\n return cleared\n const deleted = await withLease(job, async (tx) => {\n for (const name of [table.evidence, table.attachments, table.history]) {\n const removed = await tx.execute(`DELETE FROM ${name} WHERE report_id = ?`, [report.id])\n if (!removed.success)\n return removed\n }\n const removedJobs = await tx.execute(`DELETE FROM ${table.jobs} WHERE report_id = ? AND id <> ?`, [report.id, job.id])\n if (!removedJobs.success)\n return removedJobs\n // 仅保留一天最小清扫墓碑,重试删除可能在响应丢失或旧进程退出时迟到的对象。\n const tombstone = await tx.execute(`UPDATE ${table.jobs} SET payload = ?, result = NULL WHERE id = ? AND token = ?`, [JSON.stringify({ tombstone: true, prefix, until: Date.now() + 86400000 }), job.id, job.token])\n if (!tombstone.success)\n return tombstone\n const params: unknown[] = []\n const identity = `${feedbackTextEquals('id', report.id, params)} AND ${feedbackTextEquals('scope_id', actor.scopeId, params)}`\n const removed = await tx.execute(`DELETE FROM ${table.reports} WHERE ${identity} AND expires_at <= ${clock}`, params)\n return removed.success ? ok({ pending: true }) : removed\n })\n return deleted\n }\n\n return operations\n}\n\nfunction allowedContentType(type: string) {\n return ['image/png', 'image/jpeg', 'image/webp', 'video/webm', 'video/mp4', 'text/plain', 'application/json', 'application/pdf', 'application/zip', 'application/gzip'].includes(type)\n}\nfunction matchesContentType(bytes: Buffer, type: string) {\n if (type === 'application/zip')\n return bytes.length >= 4 && bytes[0] === 0x50 && bytes[1] === 0x4B && ((bytes[2] === 3 && bytes[3] === 4) || (bytes[2] === 5 && bytes[3] === 6))\n if (type === 'application/gzip')\n return bytes.length >= 10 && bytes[0] === 0x1F && bytes[1] === 0x8B && bytes[2] === 8\n if (type === 'image/png')\n return bytes.length >= 24 && bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])) && bytes.readUInt32BE(16) * bytes.readUInt32BE(20) <= 32 * 1024 * 1024\n if (type === 'image/jpeg')\n return bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255\n if (type === 'image/webp')\n return bytes.subarray(0, 4).toString() === 'RIFF' && bytes.subarray(8, 12).toString() === 'WEBP'\n if (type === 'application/pdf')\n return bytes.subarray(0, 5).toString() === '%PDF-'\n if (type === 'video/webm')\n return bytes.length >= 12 && bytes.subarray(0, 4).equals(Buffer.from([0x1A, 0x45, 0xDF, 0xA3]))\n if (type === 'video/mp4')\n return bytes.length >= 12 && bytes.subarray(4, 8).toString() === 'ftyp'\n if (type === 'application/json') {\n try {\n JSON.parse(bytes.toString('utf8'))\n return true\n }\n catch {\n return false\n }\n }\n return type === 'text/plain' && !bytes.includes(0)\n}\n","import type { FeedbackConfigInput } from './feedback-config.js'\nimport type { FeedbackRuntime } from './feedback-functions.js'\nimport type { FeedbackFunctions, FeedbackInitOptions } from './feedback-types.js'\nimport { resolveFeedbackBudget } from '@h-ai/api-contract/feedback'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { storage } from '@h-ai/storage'\nimport { createFeedbackCapture } from './feedback-capture.js'\nimport { FeedbackConfigSchema } from './feedback-config.js'\nimport { createFeedbackOperations } from './feedback-functions.js'\nimport { feedbackM } from './feedback-i18n.js'\nimport { FeedbackReportRepository } from './feedback-repository.js'\nimport { HaiFeedbackError } from './feedback-types.js'\n\nconst notInitialized = core.module.createNotInitializedKit(HaiFeedbackError.NOT_INITIALIZED, () => feedbackM('feedback_notInitialized'))\nconst unavailable = notInitialized.proxy<FeedbackRuntime>()\nlet current: { operations: FeedbackRuntime, capture: ReturnType<typeof createFeedbackCapture>, config: ReturnType<typeof FeedbackConfigSchema.parse> } | null = null\nlet generation = 0\nlet initializing = false\nconst inFlight = new Set<Promise<unknown>>()\n\n/**\n * Feedback 生命周期与公共操作入口;依赖由应用初始化并在 feedback 关闭后释放。\n * @example\n * ```ts\n * import { feedback } from '@h-ai/feedback'\n *\n * // 宿主先初始化 reldb、storage、reach,并在反馈关闭后释放依赖。\n * async function collectFeedback() {\n * const initialized = await feedback.init({ appId: 'orders', recipients: ['admin@example.test'], adminUrl: 'https://app.example.test/admin/feedback' })\n * if (!initialized.success) return initialized\n * try {\n * return await feedback.submit({ appId: 'orders', submissionId: 'stable-submission' }, { scopeId: 'tenant-1', userId: 'user-1' })\n * } finally {\n * await feedback.close()\n * }\n * }\n * void collectFeedback\n * ```\n */\nexport const feedback: FeedbackFunctions = {\n async init(config: FeedbackConfigInput, options: FeedbackInitOptions = {}) {\n if (initializing)\n return err(HaiFeedbackError.INIT_IN_PROGRESS, feedbackM('feedback_initInProgress'))\n initializing = true\n const epoch = ++generation\n let candidateCapture: ReturnType<typeof createFeedbackCapture> | undefined\n try {\n const parsed = FeedbackConfigSchema.safeParse(config)\n if (!parsed.success)\n return configFailure(parsed.error.issues.map(issue => issue.path.join('.')))\n if (options.collectEvidence !== undefined && typeof options.collectEvidence !== 'function')\n return configFailure(['collectEvidence'])\n if (!reldb.isInitialized || !storage.isInitialized)\n return configFailure([!reldb.isInitialized ? 'reldb' : 'storage'])\n if (parsed.data.notificationMode === 'reach') {\n const provider = await import('@h-ai/reach').catch(() => undefined)\n if (!provider)\n return configFailure(['reach'])\n const { reach } = provider\n if (!reach.isInitialized)\n return configFailure(['reach'])\n if (!reach.config?.providers.some(provider => provider.name === parsed.data.notificationProvider))\n return configFailure(['notificationProvider'])\n }\n if (current) {\n const previous = current\n current = null\n const closing = previous.operations.close()\n await Promise.allSettled([...inFlight])\n await closing\n await previous.capture.close()\n }\n const repository = new FeedbackReportRepository()\n const ready = await repository.ready()\n if (!ready.success)\n return ready\n if (epoch !== generation)\n return notInitialized.result()\n candidateCapture = createFeedbackCapture(parsed.data.appId, parsed.data.envAllowlist, { appVersion: parsed.data.appVersion, buildId: parsed.data.buildId, commit: parsed.data.commit })\n const operations = createFeedbackOperations(repository, parsed.data, candidateCapture, options)\n if (epoch !== generation) {\n await operations.close()\n await candidateCapture.close()\n return notInitialized.result()\n }\n current = { operations, capture: candidateCapture, config: parsed.data }\n operations.start()\n core.logger.info('Feedback module initialized', { module: 'feedback', appId: parsed.data.appId })\n return ok(undefined)\n }\n catch {\n if (candidateCapture)\n await candidateCapture.close()\n return err(HaiFeedbackError.CONFIG_ERROR, feedbackM('feedback_configError'))\n }\n finally {\n initializing = false\n }\n },\n async close() {\n generation++\n const previous = current\n current = null\n try {\n const closing = previous?.operations.close()\n await Promise.allSettled([...inFlight])\n await closing\n await previous?.capture.close()\n return ok(undefined)\n }\n catch {\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n }\n },\n get isInitialized() {\n return current !== null\n },\n get config() {\n return current ? { ...current.config, recipients: [...current.config.recipients], envAllowlist: [...current.config.envAllowlist] } : null\n },\n get budget() {\n return resolveFeedbackBudget(current?.config)\n },\n submit: (input, actor) => guarded(() => (current?.operations ?? unavailable).submit(input, actor)),\n list: (input, actor) => guarded(() => (current?.operations ?? unavailable).list(input, actor)),\n get: (id, actor) => guarded(() => (current?.operations ?? unavailable).get(id, actor)),\n getEvidence: (input, actor) => guarded(() => (current?.operations ?? unavailable).getEvidence(input, actor)),\n setStatus: (input, actor) => guarded(() => (current?.operations ?? unavailable).setStatus(input, actor)),\n appendEvidence: (input, actor) => guarded(() => (current?.operations ?? unavailable).appendEvidence(input, actor)),\n completeCollection: (input, actor) => guarded(() => (current?.operations ?? unavailable).completeCollection(input, actor)),\n uploadAttachment: (input, actor) => guarded(() => (current?.operations ?? unavailable).uploadAttachment(input, actor)),\n getAttachment: (input, actor) => guarded(() => (current?.operations ?? unavailable).getAttachment(input, actor)),\n retry: (input, actor) => guarded(() => (current?.operations ?? unavailable).retry(input, actor)),\n export: (input, actor) => guarded(() => (current?.operations ?? unavailable).export(input, actor)),\n getExport: (input, actor) => guarded(() => (current?.operations ?? unavailable).getExport(input, actor)),\n runJobs: () => guarded(() => (current?.operations ?? unavailable).runJobs()),\n}\n\nfunction configFailure(fields: string[]) {\n return { success: false as const, error: { ...HaiFeedbackError.CONFIG_ERROR, message: feedbackM('feedback_configError'), ext: { module: 'feedback', fields } } }\n}\n\nasync function guarded<T>(work: () => Promise<import('@h-ai/core').HaiResult<T>>) {\n const promise = core.context.run({ suppressLogObservers: true }, work)\n inFlight.add(promise)\n try {\n return await promise\n }\n catch {\n return err(HaiFeedbackError.OPERATION_FAILED, feedbackM('feedback_operationFailed'))\n }\n finally {\n inFlight.delete(promise)\n }\n}\n"]}
|