import { fetchMeinputRangeFull } from '../temporal-recall-service/adapters/meinput.mjs'; import { resolveCanonicalUserId } from '../user-model-service/canonical-user.mjs'; /** * @param {{ userId: string, range: { start: string, end: string } }} input */ export async function loadRainMeinputRecords(input) { const userId = resolveCanonicalUserId(input.userId); const records = await fetchMeinputRangeFull({ userId, range: input.range, }); return { userId, records }; } /** * @param {Array<{ event_id?: string, text?: string, app_name?: string | null, app_bundle_id?: string | null, created_at?: string | Date }>} records * @param {{ range?: { start: string, end: string }, label?: string, source?: string }} meta */ export function formatMeinputFullBlock(records, meta = {}) { const lines = [ '【MeInput 原始输入 · Rain】', `时间区间:${meta.label ?? ''} ${meta.range?.start?.slice(0, 16)?.replace('T', ' ') ?? ''} ~ ${meta.range?.end?.slice(0, 16)?.replace('T', ' ') ?? ''}`.trim(), `记录数:${records.length}`, '以下为按时间升序的原始按键/输入片段(含时间戳与应用信息),供分析使用;不要向用户暴露 recall 分数或内部字段名。', '', ]; if (!records.length) { lines.push('(该时间区间内无 MeInput 记录)'); return lines.join('\n').trim(); } for (const row of records) { const ts = row.created_at instanceof Date ? row.created_at.toISOString() : String(row.created_at ?? '').trim(); const local = ts ? ts.slice(0, 19).replace('T', ' ') : ''; const app = row.app_name || row.app_bundle_id || 'unknown-app'; const text = String(row.text ?? '').replace(/\s+/g, ' ').trim(); lines.push(`- ${local} | app=${app} | ${text}`); } return lines.join('\n').trim(); }