From bb349fc4b879930b9d8f253544fa51e4a82608ef Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 26 Oct 2026 19:05:53 +0800 Subject: [PATCH 1/2] fix(chat): hydrate complete history through stable original-session pages Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../dashboard/smoke/chat-route-smoke.ts | 62 ++++++++++- .../conversation-history-http-fixture.py | 18 +++- .../conversation-return-browser-smoke.mjs | 41 ++++++- apps/presentation/dashboard/src/data/chat.ts | 65 ++++++++++- .../app-conversation-and-async-inbox-v0.md | 21 ++++ ...p-conversation-and-async-inbox-v0.zh-CN.md | 14 +++ .../conversation-pagination/README.md | 34 ++++++ .../conversation-pagination/after-desktop.png | Bin 0 -> 99022 bytes .../conversation-pagination/after-narrow.png | Bin 0 -> 38785 bytes .../before-desktop.png | Bin 0 -> 70149 bytes .../conversation-history-recovery.mjs | 56 ++++++++++ .../manager_context/presentation.py | 20 +++- .../capabilities/manager_context/roundtrip.py | 20 +++- loopx/chat_server.py | 15 ++- loopx/chat_store.py | 54 +++++++++- tests/test_chat_conversation_bindings.py | 101 ++++++++++++++++++ tests/test_chat_store_input_validation.py | 27 +++++ 17 files changed, 528 insertions(+), 20 deletions(-) create mode 100644 docs/assets/personal-workspace/conversation-pagination/README.md create mode 100644 docs/assets/personal-workspace/conversation-pagination/after-desktop.png create mode 100644 docs/assets/personal-workspace/conversation-pagination/after-narrow.png create mode 100644 docs/assets/personal-workspace/conversation-pagination/before-desktop.png diff --git a/apps/presentation/dashboard/smoke/chat-route-smoke.ts b/apps/presentation/dashboard/smoke/chat-route-smoke.ts index 937501ba86..7fa384a7c8 100644 --- a/apps/presentation/dashboard/smoke/chat-route-smoke.ts +++ b/apps/presentation/dashboard/smoke/chat-route-smoke.ts @@ -540,13 +540,13 @@ async function checkSessionHistoryRecoveryContract() { globalThis.fetch = (async (input) => { const url = String(input); requests.push(url); - const body = url.includes("?") + const body = new URL(url, "http://localhost").pathname === "/api/chat/sessions" ? { ok: true, schema_version: "loopx_chat_session_list_v1", sessions: [failed.session, ready.session], } - : url.endsWith("session-failed") + : new URL(url, "http://localhost").pathname.endsWith("session-failed") ? failed : ready; return new Response(JSON.stringify(body), { @@ -676,8 +676,66 @@ async function checkActiveTurnStreamRecoveryContract() { } } +async function checkPagedHistoryContract() { + const originalFetch = globalThis.fetch; + const rows = Array.from({length: 451}, (_, index) => ({ + message_id: `original-${index}`, turn_id: null, role: index % 2 ? "agent" : "user", + text: index === 201 ? "完整正文".repeat(3000) : "Deliberately repeated text", + created_at: "2026-08-10T02:00:00Z", + ...(index === 201 ? {attachments: [{id: "original-image", name: "original.png", mime_type: "image/png", size: 1, data_url: "data:image/png;base64,AA=="}]} : {}), + })); + const original = historySnapshot("paged-original", "ready", rows); + let failure = "", reads: string[] = [], sourceReads = 0; + const bindingId = "a".repeat(24); + globalThis.fetch = (async (input, init) => { + check(!init?.method || init.method === "GET", "History paging must not execute work"); + const url = new URL(String(input), "http://localhost"); + if (url.pathname === "/api/chat/sessions") { + sourceReads += 1; + return Response.json({ok: true, schema_version: "loopx_chat_session_list_v1", + conversation_binding_id: failure === "revoked" && sourceReads > 1 ? "b".repeat(24) : bindingId, sessions: [original.session]}); + } + const cursor = url.searchParams.get("message_cursor"); + reads.push(cursor ?? "first"); + const offset = cursor === "page-200" ? 200 : cursor === "page-400" ? 400 : 0; + if (offset && failure === "transport") return Response.json({error: "interrupted page"}, {status: 503}); + const messages = rows.slice(offset, offset + 200); + const next = offset === 0 ? "page-200" : offset === 200 ? "page-400" : null; + return Response.json({...original, messages, + session: {...original.session, ...(offset && failure === "identity" ? {channel_id: "another-channel"} : {})}, + message_page: {schema_version: "loopx_chat_message_page_v1", offset: offset && failure === "offset" ? 0 : offset, + total: offset && failure === "total" ? 452 : rows.length, + snapshot_sha256: offset && failure === "digest" ? "b".repeat(64) : "a".repeat(64), + next_cursor: offset && failure === "cursor" ? cursor : next}}); + }) as typeof fetch; + try { + const history = await fetchChatHistory({channelId: "manager"}); + check(history.messages.length === rows.length && history.unavailableSessionIds.length === 0, + "The default history owner must drain all original pages before claiming a complete snapshot"); + check(reads.join(",") === "first,page-200,page-400", "Read the original advancing cursors exactly once"); + check(JSON.stringify(history.snapshots[0].messages) === JSON.stringify(rows), + "Page boundaries must retain append order, repeated bodies, full long text and attachments"); + for (failure of ["transport", "identity", "offset", "total", "digest", "cursor"]) { + reads = []; + const incomplete = await fetchChatHistory({channelId: "manager"}); + check(incomplete.messages.length === 0 && incomplete.unavailableSessionIds[0] === original.session.session_id, + `An interrupted or inconsistent ${failure} page must not become a complete history`); + check(reads.length === 2, "A failed cursor must stop the read, without a loop or replay"); + } + failure = ""; + check((await fetchChatHistory({channelId: "manager"})).messages.length === rows.length, + "Retry must recover the full original snapshot after a partial-page failure"); + failure = "revoked"; sourceReads = 0; + let refused = false; + try { await fetchChatHistory({channelId: "manager", bound: {bindingId, sessionId: original.session.session_id}}); } + catch { refused = true; } + check(refused && sourceReads === 2, "Recheck the original source after all pages; a revoked binding cannot publish the old read"); + } finally { globalThis.fetch = originalFetch; } +} + void checkSessionCloseContract() .then(checkSessionHistoryRecoveryContract) + .then(checkPagedHistoryContract) .then(checkActiveTurnStreamRecoveryContract) .then(() => console.log("chat-route-smoke: ok")) .catch((error) => { diff --git a/apps/presentation/dashboard/smoke/conversation-history-http-fixture.py b/apps/presentation/dashboard/smoke/conversation-history-http-fixture.py index d16577cc23..2dbfbb3d9c 100644 --- a/apps/presentation/dashboard/smoke/conversation-history-http-fixture.py +++ b/apps/presentation/dashboard/smoke/conversation-history-http-fixture.py @@ -6,6 +6,7 @@ import sys import tempfile import threading +from urllib.parse import parse_qs, urlparse sys.path.insert(0, str(Path(__file__).resolve().parents[4])) @@ -16,7 +17,9 @@ class HistoryReadFault(ChatRequestHandler): def _session_snapshot(self, session_id: str) -> None: - if session_id == self.server.unavailable_session_id: + query = parse_qs(urlparse(self.path).query) + if (session_id == self.server.unavailable_session_id + or (session_id == "old" and self.server.unavailable_message_pages and "message_cursor" in query)): self._send_error("Synthetic history read unavailable", status=503) else: super()._session_snapshot(session_id) @@ -50,6 +53,7 @@ def main() -> None: server.chat_store = store server.runtime_controller = runtime server.unavailable_session_id = "old" + server.unavailable_message_pages = False thread = threading.Thread(target=server.serve_forever, daemon=True) thread.start() print(json.dumps({"origin": f"http://127.0.0.1:{server.server_port}"}), flush=True) @@ -58,7 +62,19 @@ def main() -> None: command = command.strip() if command == "recover": server.unavailable_session_id = "" + server.unavailable_message_pages = False print(json.dumps({"recovered": True}), flush=True) + elif command == "history": + for index in range(450): + store.append_message("old", role="agent", message_id=f"history-{index}", + text="Original full body. " * 600 if index == 201 else f"Paged original row {index}") + before = {str(path.relative_to(store.sessions_root)): path.read_bytes() + for path in store.sessions_root.rglob("*") if path.is_file()} + print(json.dumps({"history_rows": len(store.messages("old"))}), flush=True) + elif command == "page-fault": + server.unavailable_session_id = "" + server.unavailable_message_pages = True + print(json.dumps({"unavailable_message_pages": True}), flush=True) elif command == "fault": server.unavailable_session_id = "old" print(json.dumps({"unavailable": "old"}), flush=True) diff --git a/apps/presentation/dashboard/smoke/conversation-return-browser-smoke.mjs b/apps/presentation/dashboard/smoke/conversation-return-browser-smoke.mjs index 3e998646f4..1456c0b7f6 100644 --- a/apps/presentation/dashboard/smoke/conversation-return-browser-smoke.mjs +++ b/apps/presentation/dashboard/smoke/conversation-return-browser-smoke.mjs @@ -26,14 +26,16 @@ async function next() { } async function command(value) { fixture.stdin.write(`${value}\n`); return next(); } let server, browser, workspace; +const reads = []; try { const { origin } = await next(); await command("recover"); + assert.deepEqual(await command("history"), {history_rows: 451}); + await command("page-fault"); server = await startServer(); const url = `http://127.0.0.1:${port}/chat/?statusUrl=/status.json`; await waitForHttp(url); browser = await launchBrowser(loadPlaywright().chromium); - const reads = []; workspace = await openWorkspacePage({ newPage: options => browser.newPage({ locale: "zh-CN", ...options }) }, url, { beforeGoto(_api, page) { return page.route("**/api/chat/sessions**", async route => { @@ -53,7 +55,9 @@ try { } assert.equal(route.request().method(), "GET", "Observation cannot start work"); const response = await route.fetch({ url: new URL(path + new URL(route.request().url()).search, origin).href }); - reads.push({ path, status: response.status() }); + const snapshot = response.status() === 200 ? await response.json() : null; + reads.push({ path, query: new URL(route.request().url()).search, status: response.status(), offset: snapshot?.message_page?.offset, + sessions: snapshot?.sessions?.map(row => ({id: row.session_id, revision: row.transcript_revision})) }); await route.fulfill({ response }); }); }, @@ -61,7 +65,33 @@ try { const { page, api } = workspace; const chat = () => page.getByRole("navigation", { name: "管家视图" }).getByRole("button", { name: /^(Chat|对话)$/ }).click(); await chat(); + const notice = page.getByRole("status").filter({hasText: "部分历史暂时无法读取"}); + await notice.waitFor({state: "visible"}); + assert.ok(reads.some(row => row.path === "/api/chat/sessions/old" && row.status === 503)); + assert.equal(await page.getByText("Earlier public report", {exact: true}).count(), 0, + "The first real HTTP page must not masquerade as a complete history"); + const composer = page.getByLabel("向 LoopX 发送消息"); + await composer.fill("Keep this draft while original history recovers."); + await mkdir(outputDir, {recursive: true}); + await page.screenshot({path: resolve(outputDir, "conversation-pagination-before-desktop.png"), animations: "disabled"}); + await command("recover"); + await notice.getByRole("button", {name: "重试读取", exact: true}).click(); await page.getByText("Earlier public report", { exact: true }).waitFor({ state: "visible" }); + await page.getByText("Paged original row 449", {exact: true}).waitFor({state: "visible"}); + assert.equal(await page.getByText("Original full body. ".repeat(600).trim(), {exact: true}).count(), 1); + await notice.waitFor({state: "hidden"}); + assert.deepEqual(reads.filter(row => row.path === "/api/chat/sessions/old" && row.status === 200 && typeof row.offset === "number").slice(-3).map(row => row.offset), [0, 200, 400]); + assert.equal(await composer.inputValue(), "Keep this draft while original history recovers."); + await page.screenshot({path: resolve(outputDir, "conversation-pagination-after-desktop.png"), animations: "disabled"}); + await page.setViewportSize({width: 390, height: 844}); + assert.ok(await page.locator("body").evaluate(body => body.scrollWidth <= innerWidth + 1)); + await page.screenshot({path: resolve(outputDir, "conversation-pagination-after-narrow.png"), animations: "disabled"}); + await page.setViewportSize({width: 1512, height: 982}); + if (process.argv.includes("--pagination-only")) { + assert.equal(api.turnRequests.length, 0); + assert.deepEqual(await command("inspect"), {store_unchanged: true, turn_count: 0}); + console.log("conversation-pagination-browser: passed (packaged UI, real HTTP/store, 451 complete rows, second-page failure/retry, full body, draft and zero Turns)"); + } else { await command("result"); await page.getByText("First checked result", { exact: true }).waitFor({ state: "visible", timeout: 12_000 }); const firstLink = page.locator('a[href="https://example.org/forms/result"]'); @@ -73,9 +103,9 @@ try { await page.waitForTimeout(6500); assert.equal(oldReadCount(), settledReads, "Quiet completed transcripts must not be downloaded repeatedly"); await page.locator(".personal-goal-link").first().click(); + const failedRead = page.waitForResponse(response => new URL(response.url()).pathname === "/api/chat/sessions/old" && response.status() === 503); await command("fault"); await command("revision"); - const failedRead = page.waitForResponse(response => new URL(response.url()).pathname === "/api/chat/sessions/old" && response.status() === 503); await failedRead; const recoveredRead = page.waitForResponse(response => new URL(response.url()).pathname === "/api/chat/sessions/old" && response.status() === 200); await command("recover"); @@ -96,6 +126,11 @@ try { assert.ok(await page.locator("body").evaluate(body => body.scrollWidth <= innerWidth + 1)); await page.screenshot({ path: resolve(outputDir, "conversation-return-revisions-mobile.png"), animations: "disabled" }); console.log("conversation-return-browser: passed (packaged UI, real HTTP/store, quiet reads, background revision, read recovery, no duplicate or model Turn)"); + } +} catch (error) { + console.error(JSON.stringify({recent_history_reads: reads.filter(row => row.path !== "/api/chat/sessions").slice(-10), + recent_indexes: reads.filter(row => row.path === "/api/chat/sessions").slice(-8)}, null, 2)); + throw error; } finally { await workspace?.page.unrouteAll({ behavior: "wait" }); await workspace?.close(); diff --git a/apps/presentation/dashboard/src/data/chat.ts b/apps/presentation/dashboard/src/data/chat.ts index 05331962ca..bf3d0e8f07 100644 --- a/apps/presentation/dashboard/src/data/chat.ts +++ b/apps/presentation/dashboard/src/data/chat.ts @@ -940,12 +940,69 @@ export type ChatSessionSnapshot = { session: ChatSessionSummary; messages: ChatVisibleMessage[]; active_turn: Record | null; + message_page?: { + schema_version: "loopx_chat_message_page_v1"; + offset: number; total: number; snapshot_sha256: string; next_cursor: string | null; + }; }; export async function fetchChatSession(sessionId: string, signal?: AbortSignal) { return requestJson(`/api/chat/sessions/${encodeURIComponent(sessionId)}`, { signal }); } +const chatMessagePageSchema = z.object({ + schema_version: z.literal("loopx_chat_message_page_v1"), + offset: z.number().int().nonnegative(), total: z.number().int().nonnegative(), + snapshot_sha256: z.string().regex(/^[a-f0-9]{64}$/), next_cursor: z.string().min(1).max(1024).nullable(), +}); + +/** Hydrate one complete original prefix; partial pages never become a snapshot. */ +async function fetchChatSessionHistory(session: ChatSessionSummary): Promise { + let first: ChatSessionSnapshot | undefined, cursor: string | null = null; + let total: number | undefined, digest: string | undefined; + const messages: ChatVisibleMessage[] = [], cursors = new Set(), ids = new Set(); + do { + const query = new URLSearchParams({message_limit: "200"}); + if (cursor !== null) query.set("message_cursor", cursor); + const snapshot = await requestJson( + `/api/chat/sessions/${encodeURIComponent(session.session_id)}?${query}`, {signal: AbortSignal.timeout(5000)}); + const sameSource = snapshot.session?.session_id === session.session_id && + (["agent_id", "goal_id", "channel_id", "managed_agent_id", "goal_instance_id", "project_ref"] as const) + .every(key => (snapshot.session[key] ?? null) === (session[key] ?? null)) && + (snapshot.session.session_mode ?? "managed_runtime") === (session.session_mode ?? "managed_runtime"); + if (snapshot.ok !== true || snapshot.schema_version !== "loopx_chat_store_v1" || !sameSource || !Array.isArray(snapshot.messages)) { + throw new Error("The original Session scope changed during history read."); + } + // Older services return their complete v1 snapshot for this read. A later + // page cannot silently lose the cursor contract and masquerade as complete. + if (!Object.hasOwn(snapshot, "message_page")) { + if (cursor !== null) throw new Error("The history page contract changed during read."); + return snapshot; + } + const parsed = chatMessagePageSchema.safeParse(snapshot.message_page); + if (!parsed.success) throw new Error("The original history page could not be verified."); + const page = parsed.data, end = messages.length + snapshot.messages.length; + if (page.offset !== messages.length || snapshot.messages.length > 200 || end > page.total + || (total !== undefined && total !== page.total) || (digest !== undefined && digest !== page.snapshot_sha256) + || (page.next_cursor !== null) !== (end < page.total) + || (page.next_cursor !== null && (!snapshot.messages.length || cursors.has(page.next_cursor)))) { + throw new Error("The original history cursor did not advance consistently."); + } + for (const message of snapshot.messages) { + if (typeof message.message_id !== "string" || !message.message_id || ids.has(message.message_id)) { + throw new Error("The original history contains conflicting message identities."); + } + ids.add(message.message_id); messages.push(message); + } + first ??= snapshot; + total = page.total; digest = page.snapshot_sha256; cursor = page.next_cursor; + if (cursor !== null) cursors.add(cursor); + } while (cursor !== null); + // Keep the first read's execution/revision hint. An append between pages is + // intentionally outside this prefix and will trigger the normal next refresh. + return {...first!, messages, message_page: undefined}; +} + /** Read-only discovery through the existing Core Goal/Agent/Session identity. */ export async function fetchManagedAgentSessions(goalId: string, agentId: string, signal?: AbortSignal) { if (!/^[A-Za-z0-9._-]{1,160}$/.test(goalId) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$/.test(agentId)) throw new Error("Invalid registered Agent address."); @@ -1067,7 +1124,7 @@ export async function fetchChatHistory(options: { }); if (exact) for (const session of missing) known.delete(session.session_id); const results = await Promise.allSettled(missing.map(async (session) => { - const snapshot = await fetchChatSession(session.session_id, AbortSignal.timeout(5000)); + const snapshot = await fetchChatSessionHistory(session); if (snapshot.session.session_id !== session.session_id || snapshot.session.agent_id !== session.agent_id) { throw new Error("The original Session identity changed during history read."); } @@ -1076,6 +1133,12 @@ export async function fetchChatHistory(options: { || snapshot.session.session_mode !== "managed_runtime")) throw new Error("The original managed Session scope changed during history read."); return snapshot; })); + // A long page sequence must not publish against a connection/Goal removed + // while it was in flight. Reuse the original source owner, never a fallback. + if (missing.length && results.some(result => result.status === "fulfilled")) { + if (options.bound) await resolveBoundChatSession(options.bound, AbortSignal.timeout(5000)); + if (options.managed) await resolveManagedChatSession(options.managed, AbortSignal.timeout(5000)); + } for (const result of results) { if (result.status === "fulfilled") known.set(result.value.session.session_id, result.value); } diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md index 1813940400..93a2c67bed 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md @@ -1298,6 +1298,27 @@ already timed-out fetch. [Synthetic source-order captures](../../assets/personal qualify this read/display boundary, not full history pagination, reply threading or installed App/Lark bidirectional delivery. +The same Session snapshot endpoint now supports opt-in `message_limit` (1–200) +and `message_cursor`. Its additive `loopx_chat_message_page_v1` read metadata +binds an offset to the original Session, frozen row count and raw-prefix digest. +Appending during a read cannot move that boundary; rewriting/truncating it or +an unreadable journal refuses the page. Complete bodies and attachments are not +trimmed. Collaboration projections choose the carrier from the whole frozen +context, then project the selected page and its related return labels; crossing +a page does not create another carrier or reload every off-page Turn. The TS +history owner drains and validates every page before publishing a complete +snapshot, then rechecks an exact connection/Goal source. Interrupted, repeated, +mis-scoped or inconsistent cursors remain unreadable and retry through the +existing recovery path, without model replay. Unpaged v1 callers remain +compatible. This is a stateless read hint, not a new store, consumer, execution +state or grant. Response row count is bounded; server-side journal reads and +prefix hashing still scale with full history and no latency improvement is +claimed. HTTP/store and source/packaged browser checks qualify this bounded +history path; installed native input, reply threading and live App/Lark media +remain separate acceptance. The scoped packaged `--pagination-only` journey +does not certify the default return scenario's background-read wait, which also +times out with the unchanged baseline production code; that gap remains open. + Following the newest reply also survives a resized viewport or timeline, including image layout and expanded replies, without waiting for another message. Scrolling up keeps the reader in history across layout changes; the existing latest-message diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md index f6effbe558..40379c32b4 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md @@ -966,6 +966,20 @@ App 历史与重连读取同一条消息;managed 和 attached 完成存储均 [合成顺序截图](../../assets/personal-workspace/conversation-history/README.md)只验收该读取/显示边界, 完整历史分页、回复线程和已安装 App/飞书双向送达仍分别验收。 +同一 Session 快照接口支持显式 `message_limit`(1–200)和 `message_cursor`。 +新增的 `loopx_chat_message_page_v1` 只读元数据把偏移绑定到原 Session、冻结记录数 +和原始前缀摘要。读取期间追加消息不移动该边界;前缀被改写、截短或 journal 无法 +完整读取时明确拒绝,正文与附件不裁剪。协作投影从完整冻结上下文选择原卡片载体, +只投影本页及相关回传标签;跨页不重复挂载卡片,也不重读全部页外 Turn。 +TS 历史 owner 校验并读完全部页面,随后复核 +确切连接/Goal 来源,才发布完整快照;断线、重复、来源不符或不一致的游标保留为 +不可读,通过既有恢复路径重读,不重放模型。未分页 v1 调用保持兼容。游标是无状态 +读取提示,不增加 store、consumer、执行状态或 grant。响应记录数有界,但服务端 +journal 读取和前缀摘要仍随完整历史增长,不宣称延迟改善。HTTP/store 与源码、 +打包浏览器检查验收该历史路径;实际原生输入、回复线程和真实 App/飞书媒体仍需 +分别验收。打包 `--pagination-only` 有界旅程不代表默认回传场景的后台读取等待已通过; +该等待在未修改的基线生产代码上同样超时,缺口继续保留。 + 同一对话界面在用户停留底部时跟随输出,上翻阅读后保持位置,并提供回到最新消息的入口。 窗口或时间线尺寸变化(包括图片布局与展开回复)后仍应跟随最新回复,不必等待下一条消息。 用户上翻阅读时,布局变化保留当前位置;既有回到最新消息按钮恢复跟随。该行为留在共享 diff --git a/docs/assets/personal-workspace/conversation-pagination/README.md b/docs/assets/personal-workspace/conversation-pagination/README.md new file mode 100644 index 0000000000..46578f7b81 --- /dev/null +++ b/docs/assets/personal-workspace/conversation-pagination/README.md @@ -0,0 +1,34 @@ +# Original history pagination: failure and recovery + +These are packaged browser captures of the production Chat HTTP/store with a +disposable synthetic runtime. The workspace navigation is synthetic; no personal +conversation, credentials, live Goal, provider or model is used. + +- `before-desktop.png` (1512×982): the second page is deliberately unavailable. + The current report remains visible, the incomplete-history notice offers retry, + and the draft stays in the composer. This is a fault state, not a baseline-version screenshot. +- `after-desktop.png` (1512×982): the same owner recovered all 451 original rows + through offsets 0, 200 and 400; the viewport shows the tail and retained draft. +- `after-narrow.png` (390×844): the recovered tail and draft remain usable without + horizontal overflow. The original long body is checked in the DOM, not inferred + from this tail screenshot. + +Reproduce after `npm run build:chat` in `apps/presentation/dashboard`: + +```sh +node apps/presentation/dashboard/smoke/conversation-return-browser-smoke.mjs --pagination-only +``` + +The scoped scenario checks unchanged stored bytes and zero Turns after observation. +The default full return scenario also checks later results/revisions and quiet reads; +its background-read wait times out on both the unchanged baseline production code +(`2de490ed6c632e0d641453fd2f10ed3dde69fc48`) and this branch. That retained gap +is not qualified by the pagination-only result. Cross-page original +commitment/return metadata is checked independently against the real projection +in `tests/test_chat_conversation_bindings.py`. Source and packaged recovery +scenarios retain full text and drafts without replay. + +All pixels and PNG chunk metadata were inspected; no textual metadata is present. +These captures belong to the code in this PR. The fixture's unrelated delegation +read is unavailable; these images do not qualify delegation completion, live Lark +transport, actual native App input, reply threading or installed media delivery. diff --git a/docs/assets/personal-workspace/conversation-pagination/after-desktop.png b/docs/assets/personal-workspace/conversation-pagination/after-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a1311798779d3735a2e78646a59f448f999e6b GIT binary patch literal 99022 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%0D)2+o|<^6v^&_u8$z2Q!+iaI?P; zj^0GMtF*6+=dinkmLX%)#uUieLq%C%3TkxXQ<^fX-9mv=uSMsHQz z81qh#W4|DA83xtw-w$oiBmVpQcG~sji~q5x%^|&3tf@1ZQ99AQ@065 z6^r{n5NtOp>=>C5?4@OOXN$WV0nQ5BOR;hZYjVycTC zp=Go9)D-OCRTSnoHw!kQyGPHV{mNXs&s?Kj4bCCB?pbQm)Y?`0Zk;36j%ufUHqPj{ z*yQIs-Q=Jj(r%Z2Gz@uHJ#~*>cU$o(sUU(LJnZQR_}gk0Uk zq#c$ZznGQ^UyCzt8*6Wp^Sg;G%Kpf*#;>H(k$QTCXFt$EFVPlgN_5~nfWll%uP>~4 zJw?GV|Lrj`8YyIp!7ZQWf&S0PTO8x`8@6WLb_Zj43KTJQ*^6WwmC~<77;LD2ett9_ zRtv7PcQfEqRRJMs8S>WKQ+lWjHei#C6jG;{_Zf4-z7;&r59lrLP+RplMKE?W2`+8> z7Ylgm5;~k`s=Mv|P%{PGd;0a;MN3BH?mq58)|~ZhGNm}Uwh(j7Ep!w2T)Lb};8bSp z>v*a*L$HIsx}<}4zd8M4{k^^jE-&0YuMW)L{VC%7_wV#sUiyHVU^P=-u9#+->6c+W zpE%3OWOYU#SOBTtJ-nm+GiRJEeg1sFl8Fd#mxlz>t)%~cxmnRSaf50i(Am?+kAoVo z^&>S{{{lVo)&A!}w?!Ly36UE^hhJ)SI6fAOPv!c{1s$gR7JzKhm)y2tuDP`oK!c|4 z&nF2fs8#uPQogY^qT(6n6ZuJr{K;(NhF=TzdHimvq~BluE@t_G#7qF`!|Q(wn~e)y z0~KW0h12~+&6j3jA}$u`W?{vWCG0c=GJFE)YgE)lQ z^!Pi`SM)oM9CoT3Ex5(le~vjjINSrGiu9FT_UTe9&0x%@trE2e)NS0sY_<(`;zq&O zu54~_YE|5qBi%JwVWLZ~nC-vMW4t1nDO#s`C+C<|m4IMHwl$8auB{Cf&!q$X@vy_* zbzaYE%VQqPEjY17T_w5bRIdt2{a3|r8hwdd#;5RgrH_S9%2!i=0ktCr4b}@ZiA%(tJ&{RiA;$+3bZ? z=o|`|y*4Y24=n6Ki^Te|}K@b&toUSnUNn<0oY7yb$-PPO01>GCwuv z)JKthN(~KIrrzDe?HT1$sbD<|Afd<|qk(Gq)*)Ap_+by&-9b|(BR7BFv~Fh_Jd%5A z7jFJa_(yD7;uPEO7yDHf&CuE?UpUpz%EG>QwY%)hp|v_%T3VvjIqRH1UdoHLs~m%~ zLS}~bq>XKLmfId@tE!p#kUhYAXsCm;Z3`q!^}p?DZ$j(iT1CCnl+8CO1xl8diNHPx zHxPKm^liWA?rI;C?#*4iSTkyc-rRK$rpfndE`4|XL;TfluLr#UnpD4Q$3*5hf54dd zo|`$OLVUYPPHf8qze$Vpcd{0#KK_SfnMIPQ`z_+?uBivEx(ntf1I7%>(kpz+Zkg;Q zeM&_ZsH%Va@GtF&sHFbFIkF){ZRXnw)4*_Vnrbe?fVh*L8Dz zQ$tce;G6L7;%jqH^Y1SUeCH=g&4gGo#iV&v>|1L`aTx2FTW)3DW9BVN2Nx zRÐ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 =W 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 TeBDoc8N0zlt&a|zxblAiKCuPS literal 0 HcmV?d00001 diff --git a/docs/assets/personal-workspace/conversation-pagination/after-narrow.png b/docs/assets/personal-workspace/conversation-pagination/after-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c9506ead26a1efae906804e249c3f6adf9e31442 GIT binary patch literal 38785 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 W27>|7!*;8(u%bSArHox z5yaF^ABDP;qLLDR!$V`^40en&H9$^sW}#AVcfnmZG0Wzzy#vBq0&145TB} z4>rdWgpY<0lq7cekMiaJRr2`XG~9n5Qf_;AUOhw0&+q8->52WT7>KiA!opOQlq|cK zRDH#Z(~_FIVpuV1Hk!R6)Mt$+7tes^60fCwSkmo~#s{OL4tfFG_aSo_@Q)44u){FrmrTfd= zTq0xL3x}_1uLdwOk+p9QD8xSbHB~L%Y-O)U5NHXRYel~Ff`Wn}%^do0)T{CIgD08! z%~fVJv?WB7qHV8euIjRiyqT#)z4|~`x;-@C8A4$Y2kI*hQ-%kcRDnMjYoJ5+m=8^b zR8%Z_dLKDye-N9cL8XAtf>l?#br$0Uk!_{tU&QI(SRO<`ygQyF?ou**4`X;(nlJo3 z1I{ZD*S!Kzy1*)bf>Sf~OWzB23?Ty^ql}JX%226U6F|jezWY8vUc$(j%N1gWhYfpe zil(Nf{9ER>9Uo@RbybmG7PbX<7bK2NHOM?QrQS>Teo)i`X9F&l!T2ksVCz-h}Ww72slbUQcA zptJMWZZrar%Qg-H5)KWr9LR0^ZE;|?w+-%Fy((tN>KhfX2iweVF3qNhRRCg3U=I6( z1Ob)9`L=BhTA8W$Y!W0V(uhG4`#>D(-iL=Dpp`+dg$U3Th(5=GJR;<6h=0O+`Lj4^ z^Yt06@mtWJoa3iJ2fsO&V;PzPxB@qIqIw}y4ca;{*i3xUhSfWl%m z5gT(p=dqznF1!DNT`4?1bkSid2A4iFx?lR>?EQY%i@?d3`*R5x79fIsx-+N~PF9Y! zM3k+9nH`r8;kIuDH>d0N#@X;K$N}QoL-%~GldU}z%ENo_W6=);_<&C|YS<}%ee(2N zS{bWOP-1MIb)Dpy0JMQl;J{@{!9J#7)GTD=zvzHsj<#xE06XD#xaA8NrXrU9 ztc+|!hcjjoF0*XMf_<+NcTTJ~Oaxk9qiF(W*ZAW~vF&|3Xhr%(h600mpeco_DOU{W)& z3_lirIJ5xU5xbNJ#PJbCuTf^+&MK*dJ|C>)Qr^2S>giSUZhL|`KI3`KSG-m?M*&~z zJ8g)H;-BsXK&-g4>;H@w_fd+2nZ90lfv*_y?^q%yv}lq^G&+ zQM3JOyG{@|fD=JaW0S`vC@6^jg(z<_inA#jV6G*7W0t(Q-E73B5|t`wMXaZ6+wy|m z^+_h$cpto)3Zfjk1AbDP2n5qb%I^?wat;}BP>H<~EgGLOSMtMUz0&0lZm?6$38zML zBXssv{pfO#B%ng;AZ`afaFoX(_{W0_nT-ln3BTpI(T=__E@AA@Ed0Er=eD|pdQ(^Q zu=vL}(JT)}oY`j_{b-QrHVQktyD<`5%l#!#&&s^({SGp);A7s2)-WfevQzYdaxx4F zn>^xs@2$HplX8521nCRXVcaqep4TnGeQcu7fIe0a57}9I4C@+eRnughI`j``j5S@m z9%P_WZK#|=EVNQHh|ngTIVNlj3U7x0T3hpFN23ekUv^kq!2gr_MKP}kvMvhv zt~+-sXw^ZZfw_`{&8~-n2>k$b z;e(MuI*5w8Zq2kqjBw9KUyp)(ew~MoDGTD-&=C#_Hhw=PS5Z$1 zWNY>DclRn?8Tn1?{eTC^thPgAyIbk#Kd2?vUqZ)gcpWlS`t^2$ufdqrW3d~q_y43H z2!SO)Anza&#pqNUZ_J1ru>t(xwsT+)35vXM$jU{RJj>>A$|48~j~*;QUjI?wiyPg~ zMJRRiIy4nv3#kSOLUIUP){nOR!LusSmv0vty1*KZHo4AP9#vDmS23>BhNkV=a5$oD zW;AJ{{!6&A-CWU+)=CZ!3Cx@?smd>Vc%eUgTM*KbL=gc$+pH^DnMp&F6Hdd$gYDSX>>~+II zm-JXlwE86N)>l8=C9;L&Lj+^rkC70d+rg0vo{sEQhekpf9 zs4!p<6pkDLLIuGH?pz#p2_u*oGg=PByBwqktm<2xV%dcK6#Ou&FFhjdg|&Ko86k zvsIxva+KycFep1%li4Sv!zHAmhnxFDoI;5XSe!|$)#5x2TtP_Zk4lBzRz%fnbI7*x! zzpk%_uJid5r&e+zl1;b+@k+AL@-5J$_{JPH(i1n>oPq&G1Jh#ZP5 z1owhyU;d5H6qrOqErz(=~145>chObvAsFT?!vP9$Z8P50c-@p!(3jT=D zPYlLIM6J?$Et;Ng8B;AJAu<%V`yf({8cHJC5KO+F* zAH0<6m_vRA(B;osb4F7Ic&9}4W3Ig!NGgXW7A6yZf?4{(AoVT5#Cj9A$_OWI52`?e^$ zQ2D5~lvr^qRD|@UyHU5iS7(4argA+tzr)~?dpQVEoPaO-(_vuMy2S$70r#5o>(uX1 zmMGhW?)7^WO9u>6A^uOiafTV8qvRes)psvkt12PkCo5$q-obtSYyojn!nCHFD<$xZ%)P+}w&hI)JJR-)qRYK%(`CThoCpBel`epA+SS36_q%A}(*bM#Go7c8cWu(S#<82T;J;<~x=8CK$M zO88N~1#M?zKq~%VnNSYxG~v?995KI0la{3$=#xI?3}Y|DEP}F=wI4hbQLxWk$6?U8 zVPECpW}#}|7L{s9+N-dXvO+Y1q*E(QEfOMG$ulT1alc;vl|ymnJj2x*G0KbS4?bD< zWGwn-q(31vP#`Ic-E4?_wb6a8J(K2PqwVkilyq1uA&PM7nrKbeq?T&Rv4u{lfRb*5 z+TS4gxAt=-yi`WP|Ac%L-U0G~#@dkyYCUq?O<-ykVd7(t7BjJcZXr%M^#a&6MZGt> z`=Micub z&YjkXw%KvG)a-H)6$1%cFRpzg>pWDua!s>8$xjdUnWP+ zr=DlTRInCh^pP86Xq;MSrc@<6rb;1h)GG1XCh6UPcm`Cv{K~_uTOEfiXY;G6aD{1a^2{i zd_+Y=Z0so%k9R}y0MIu!HsA_Dyw8@rRipx&Izow|Sd3b%wnjeTk!F^MpkJ665_|YK zwa~y8x77#}wq6yHLmNnYm{pFc1QAN5&Kz2T-!WOKhYTj?;`4w6&oo&$(#e1&4fvSW34O>BXX6PKhAKE>tJtohQyyNjgf-d;cBpan_+u)dIYGD@@{eHC4Qq=PG>n6*V%b+-n?!Y8o z&A(HcV=e99{vG(Y5|&XLN%;LBLzxwF?e2T$WVqMC^lO7Wol#mQaL0G1pX)&u@m{)i z*BxXND4#%B=&}h`w6TBy%y{|cY*W;(FJ9Rf3W~p2vlnlH5I@d`T;}8esmH& z3S|w#CJVU=@V-4)hHnItkds%g%%=k5xLszhye&+j0HF`OM-ilF=%H7xaRK*na^-90gVGnheeYtJB?lle`@ zVG5^WSFeRlA;@gq$P+*QcY4z134Min{S@>roIy8yjqoTn^~3T@4W4Ldf{w6sk6Xhx z4uQ%)paF{pcyOi4Vf|FZw(p6M&*s-loBptg8mAwW7XV9SKP#PLea!v9YA~&KwNiQm z=}3qRm+0sBz#{&=DrYm{$f!}^wza#xwqH7ucyRe^VNEBugj3MwncsjVDXFU7a}2Ka z1qm&{CH@Jwl+aEKLGV&op&XX%h);q@=k%X83Ru`*1G5t>&Ls{0I(LYP-jNAB6Ww40 z!qe<0{E~ov+jofci?}c7?!sp5It2F8Bmt}M;fy!=N}Jv+fFi$VQ%qGtcYnSxA4dO! zD6mSWdHMaDUHg|WD_PHg18U(7mj#H)K2U5hW_#rd6}6V`8N`4*{j<>jloUMNy1>Il zPNs|h#!W!3K5i-*%g4BO1eb$@&$6Ms zq95O$_k}usmRhKloG&i&o;MS(dS&xxAUJF;l6lYQ&ELX}tS@WUh<^lL-5~E@N$JgI zYNmM7TQH8@tb>d(Y(QLSSE1HO=KY6W>0^r_B$h!b^U<)(Jo(so03=3xdTG}LkW}hF zhP%W1pm?0=09qJEJieS%bm!f3tFXIhy31&8{nt?=aWldlR>|$ox#Cf4LW!Y=UTdGL zqOCZ8bg|`Lzz;tba~vBk&#qEE86JheB;ofs#O@&YxwyR*RYC1=P0fwL(Viy48BZdI z3|Fce>$CQ8uh*&65Nf@EA?c%nlS$V_nLSy-dQC={&qj+gA&5Zl5vnzl72ahz$W7T0=c#k0z2h7m%~ zGkj&C1z+S&%~O82oe*B~h#Y|Q@T>zWF0e|?!JDNQ1ZH?|N?`!~NP(E>wA}yiV?S!M zyHKYKmtohC@>6_`^^OB5*SzBHT=IXXBmK*8{n-3?*&Om-_1!??7BU7<>hve7N%Wn$ z@hcNl$V9?=luKBvRh$5NOJ9N3M~aAs=T}4Li_6w&vN{)DK`@-w z90CYkDxKnCJa&FajdapByp)VdT>i!LU)Erd+fujNo%k^C1u)wDfxFj}=9zeW9@UnT zT4XQsmL&qVhV~#D0NLL%Z8$9+m+SNm2|cNfRN3`)`dE^7&fcId#*9VBDxioM6f7zA zyW&k_0|381>)xL2oKI9zRxW#JtOtE$Aav&zEJ)b@C|0BWXbZD!bFE48` zh<@K}*G0bTy2W!L^my(=ecsUT)re>-fT!D$uH8le!uME$K^ku0;$Dx$H`> z<^Or4$yqh5$t1_Wo^7&m4>Zb!`1e_7l?h>!cz>}!xE({s)kc&3erD@(R)n@yBwwjqoo7Exa;D^s|drlzK!pWjl&ukg!UZ*aRlNDPs*QpZC;B1#*5!^!^_r7#w<{YIMd zIp!G(%0h0G7L0`u&fWt?cSY)Pm%0$_t@a>_o)p}E`yG~I{cq7j*aPl!-c#?T!u+mC zp228X$Q>#%{R|<12ss!yFQ3Lh)LN1qo>mb64lpE@nh<}1^ zG~CtX{`bg7-FPBRbJM}!XXnEJdc`;{<~BYhmtD|YTD=q%_j=Ky*aSq?i!8X@+R~n# zP}jr(!voH;sd^0CV6f%0^y||exV4bOXuw78U#B}h#66`zA&P={41&TwZ?%9JgAd_+ zxML@zu@8}m>gW_8B+wGFcHvPmB7jU@TlD>J;t_Z0|04V`RAfYbR{2d=trs+gzmWem z5{H~VES?xT4i(%47XZwUrJao#ZEgX-XY-9Yeb={7x|*YBqB0_aDL=r55%YP0|4Hma zhd);gcoSIzCE)z7({K``46&AiaLRi~JsWGn!!s5%Ku~lh@%#WgAYIsQ;B#Q$wBy2n zdn}`4RZuY&3J4^8(%TmyVIsB!H{|8$FJ>N#1GBI$kbG?I=(zQNpZj=TEjls}!~xo( z&D@stx7yY8zS!J8A=Ceojz|h6L2wxIB&40Yw&<)|Sk~_4M_0Ul0~{enji}{CyXJZ> z>_dT(J>Jo;IDqFiP%<#2?K{-|CxH*2`s)eyk(Yt^CvAaN7=sP)e;zrbfTi#$4JT7+ z&DFr+eX>vz*kr=1BS}z5jr&hxAKMpPd_JVHQvWOUAu6QBckg4A?+Nriv_UkJ1a@ml zG=lNTj~6jz3f<{qs!zWc-;cDipcPOMuU)Fp$soHDJqsI)oD#=GFtUu;8sVNB13NsI zBiAx#(CltzC!bp;)w}eq(W2N8P`JEiP>n<#$HF6TxW!9MsooLLGLZrUZU%7DA#5;m zl8p?@;WZa}f1Bt3)Bf0n(XiZ-2>Wcw?3kC*9Ks))%B`xUU;I;b!^N-i@)ng}%v^=u zgS>!X{tJ(O>GS2woYmJWCT{@-$%9!@WkhX0Gc` zsHgnaaC$t-r{3Tgf<#xuoxf=AT>vTP!GYZlZtLMShL8YsBxaKK%)}(pRM}ircu0z7 z$9Np-h~$4@BUkPIJ2s*-4U9_S1bbglA9oYlz$ybaukZh)BM~+#2%5&}2Rx+;?sDZq z9MbJ6{1c$FG9E(CJj{so8JA({i!}bh@`+v3a!d38&qCrni465AY@5@wu*8;&v-3)E z(Kq+MmCd9hpL!qUkcppgsi(v_gN2d9Q?GsU(L!!KtOGGRM#|Hc$^XyDNPJyOTJZ+~ zE!dVB2kPj=p*SZyxq>fn2uh0=DC>WXMT%bhk60u=@m1v1WnQVT7F*3(eU%_WWBRXq zEW{aJpk81nQfR6g1@DiDoRU{h6y*;&iXp4bezliEcsxi`*{Q^M)RwWWfZptf1layC zdp#UsWYrw~5I?j^TZO*QF~LzRp_KaOR0IymKe}AAPWmJO1hs)>xtz;aA`kSl4-J=J zu+2n-_vkYDkdzU5y6P#TjEz`7+b;=S2s?`y)Fe*+@0f_#xEEW8@)?EUqaH*2QEs(vM6I zD-&|>uqXF_lyQ5@kx-b;hnKosVpjMmvmkevllce8j$)eDYq!Y`ds5lbYr%j_CX`V) zUUYD6f=63%XacukrTp~(ru~`P?V0wc-{YL7T4KJ(F$k2=XN3&$k5HE@^Tz237}?Mb zqhaTA;elnOR%jbZ4b!jm@KCMN`_P7j&uX|*P)w@ZBK`=-?tG)EuV$}KP|%{k$RzIk zBG$oQm`V{-!w@oc_#lLkDB4?7hX3=CD~Q0ZK~h5MhYMZ9dpJXq5D#!O6Kv8{x z9_=o){5d6Xnr7n?6xf-oD3|N1d5>TNg2U2#LBZrNVz7D6TCV+uanq#UfY-E0ODqfU z#mD~{7$Nb3r#eXAotk;x7M|BC?Z}6CH}ArhFJ;@uT1(VqV`($`-cHD6N~uKk(ZFSu zO+r$%L45Da5;8_n-gZ-K!pXZR^ocf#mV9%g|Sua# z;}^?N;w~G?$;pvhz4{w5tGU9~>&@$Aq!t)w>$s32&sLTs5nD8)KPP`JN%xVR@rTv` zOYi3g#m_S))QeK$+~P|V-xgSbb=|9HX_-(uUA!TIgNrjVpFk5@%=d`?Qi%QEP$55l zs_r%^vu;-awuGTk>M*9XVi@VWhshe3Eew;#h0chh~+nw`z9}~u#T5EDJq!|6O-24|UAm3c9QcUvl zbpRw9wri**r_k7+CWkI#J8s0`#~xGe=T%6M%DjB`D~33jZ0iEXtl?H2kF*du$1Ln0 z{X-miaMw(%&J_Goh~mj|k2&<1VA?x4IfhVj#-+YblC_)X>jNP~UYJ5IojztMv1Hd~ zOs-He?Ywnp5O}4a>Y*AAup1}C(#~fZ5m;^jSX@=~#!u8#V?AkMVQV$Z!%w$vAM}-qQeku*QycG`AyD1nDi+YPw_WT|f2H*OMtf{?cEKDAletf@7u5l6 zeN`DSiwY>+e}pnxattL};q}U?k+b>rBPZt0&$G@kT(+f37WJhGbO5HxfF5rsSs)cB z@|y9x!dTPXi8z+klPbA5^)LZzQESk>wI7N*`ifM1+q{l~E+ISLHQc43mU)v?6K&6M zqD$JMVH2bftxqV zUpC22mFV7(?qzk=e!<8tj2NmXL9CA9a22?VbT~S_Vrb*=uGWvQ%1{VTf|!ul-qn5o z?AT_hz`#3rI$(S4mhdUQ2_-NR|4xLm^jZk#cVe)Hz`3k6o^%KzkT`jxRv{A&H8%j0 zgCDLxCwv+WB0b))w-!t*@D+OX84`lTlE>{Gy-*(GdF$= zn4PrsBDj%D+Y1D5gnKzUVbJNLF0YGlo%PVJP{>TQ8p)(;2Bd9m658P40a{u&!Fznz zuAZw1p#uar5;KkNaS}vOZX=+>>9@%TIGTx2A9M{qz)_ zCQow@?N{K0T!2vHv+)smLvss2w6OQyX&9}|6WMrX__?FMTKwH5^F1J3Xzlk9xpqdE zH8J%QVi)i@Xe?HRL#~Q<`B?HePD;@2+L~+{($x7SeW8w&f9)*yJ(#jIUnKa&JA8O! zOcP}1YQim~SXZ$Wb0-FU^88qw!WIP(ji9$_6}41j!1M#Ch{*=7BIu$Uu^MB_pNWnU z@t=qeUG+HiuSA?nO3>krq;2O?^~5mEb8gGrMi0`XKZ=obP$H{@c_li@cdT5RHMuw^ zQzLCs#@(TDpPbqEk14 zo0C)L-7Q2ORJ&(i;XTH$<|CWGe{>*F0(`&>OwuV^$8b!wG78lh@b8s86lqWhkyDYz z5j<-y_F!ZWdGaPSRERVkU7oy-#`LKev!K_T=G`|uGAy4LY?a%@>4MlldpuZ!WtqHz z_BC_8#XX6%$3}7Lj_h8QwH!L@_(U#&Kx4~uzR9cZr}$FWE2+}v;qA@`R@3MeRs@M4 zzk;g9-r8NvxXh|1S@{!M;bP2ZFFnS$B~|Ye7k5=E!>oDj6V5Sxv11#WsZyjPJy~oN z?O-;mYOaI5&$Db{lC~cOv!)^jl=Bi_JlBd9Vb@6NVDpDwUYFVoak zl41fF*w{@XP6QF5E8@~+A2gLF_*b5sYJr-GC-iYEXVb(6hIf z{K{hxI((WI`LfFfcI^`0%Jl(0KI0hDUs4QAHKJ1)tss}oHEoK~Hn_Rp*$r`LxV1o- zzR8z9cF(=7^!3;(-5L&q{)o`f(6BI=4*bEZjzmqYJ3GbxnQw+s{ZW+YX|RV|=Z%Rn zE)wD34i-`j@BtAdk7oh4 z`26Wb*%6sKgq$5r)CJ-Ah$B<~Un?S4aJXx%QX790*qHtL_}zbkMC9*X2hlJraB~{d zOwS*_iokuAqH*kHJx9gi_uJfiaGM-JnA~}FV8SN2bPwDb z6rXsC3k@DN_eaWZFNtKTccM!GQXP30A*5LW&|~esCy2*YrtiOpc-|d1TxpU6;1~f_ znUId^2uSkE*)v>3H|ee62b(az;vO^nXa=r)`O$6&EgvClICbIj$HZcHDUMcr%J3=5 zdwdnte)X_q+IzHM=k4B3C(`(9c~v+Ui0*@=Jqg{b;T>ws4ye>*q10pVFW-ETa-I{=|4NLYaW=#4WFvA)uzWDTNOF( zMI1i$+i9e6f3FTowNzSfxp0vJ3lSfe*d|GU7RKo3L{<6w<~l&^U^Qj`Z;Bm< zp|XSsAJt2al)bWWP^sxQ`#t+q*(2iTgZWwoUD+vOr{sV2x)8Zl;;E*Ep|_deEa(?e zV1LJ3{nrkc0f{j=1)7rGf*##Qi)#qQ)}l2RV7~Nt<3)>n`!-3zXo;`Xie2SCo}t0{ zI;X4U6E?_D*!Wc6{e{?ZiR~m$l#Gz)BLfcZ#jEu$lzV#(wu*JHcgR1%u6%)=hpuK% zo%=y)&|86NJ-ZX?c>zil)4L<#q)k8BT7GaJ6-=@BZ)AlX zlRn*gzb5#WF^|C?JuN?BA8v@{`%8V}RqXI1!&j89SIujq=Nr1W_wwz1%c-oOZ{>Y0 zq|a_>aq7rR9U*>~*mC}P4IzScP_GX?+PiSQqs7urM?*#nkhu1=X7MNKuf>&-(BiJw zOsSSP7(@D81EQm(jnVWr^F4S~dNpgUqn@#JunXx+-5xH09z3;5rIx>wHCkV?w3;3| zAi}3~*SjG_I+MvogV&DzX_ZMkDBZCw(HP}aKwQAPKKRFWh6C~9UV zxwM9cs#K;Jt)&nbRRHYA(&2ObzCcj4_%dr2p49CFKP` zFHp}myWZ3e2@U&AvdAujWWn*G{wc2|z4cJ*F2Eg7BTk>*d7N(kA3TRy)j#tb?aTiw zo?|aO)qlft2*s@XE1o0a$=~uErOPj#kNkT(OMZZ<=i4Z9-3=pazR~B>mgtE^rKRgT zW~_vbna(iPSU}0C8CZD@wa~xK$^Too%73MHh+JH@(o+fXH0Y%YVpWSAYdHi31=-o7 z)?O6)&{g8RjYDC5(CaRTU$lTzY$B<0>d%cCJc7>8524YzhV^tecP>@^WJ`8Iu}3xS&>|?d8Oo1kFI&=m-F)awk5$5 zx0r>6#fNT7(ru=Nhl_h?@eU+!%NTd_SVw+n#G*dW`)q$VTl{6pim51+XG=<5k-xiH zA;=z1Xukt*=X_ssWAQs|N2)0}}soNu2x)B8}aeeA3xz+6O?WczkhAWCle8tZW= z(#B44ix%^2=!4%ffg{))Eb2bs>EqM@8;>?E?=lK^^^T^+BWz*}BL3Vz&cHab9(4$MtuhF5RDAc#7j3Gs5lXbZMx{%3zlW zu>iM$N#7Ijq$uS)E+auO-DehmLPA7}sHL`}?&j9`+l&=PNf>c}q52MN0teI1uUWCk z)4G7g2flaci>HuAl}AKnONstok`NX+3SNV~?X;j@P5y?3mk}QfN4CDYoCa(q1=gkV zB3pq6p*Vb=zoj3i?P}x(CvEg061NJbqy2W4dSL@W2)jS!C71=Y_~`5hdsj7|lv^6d zB3v7^4!mYTUM+^29-ArLKsMMs2cKSij(d%%f-Q=GRYgSXJ4!qe%;<|0i>$0HkmyYp z`dKsN)}aKfQYZ>d?EdsKvVm~%Ybw>Rl%OojpB~2)6}ZzWpI5M2Ke?-;j`E!VBlvP} z($>S=^OHDoXk*=4S0vWyM+iD*psSb$xI$8`F{B4o-$3)AlLnz`8vt~)w-Ici>K%wP z-gWCxqQ)^*bN(xZ|EW6^!{^N5CJ@a|h=_mN)r&-0x9 zmn`x7+U8Q593#0UI9&hyeIfRjY|qTk1MtmuAlQlb%&?kpTnk=FPvN2oS~F=l{YjBn z!&+N7v}lEMQ(9Pz+DMJ4%_QdXDsiVR%pr&odfIQ2L>zmTM4HbjQToY8i3$=Ip5t>0 z#opss^DmNw7UFS*o=I=cW(+XlczLj`sO;R~96(2=m|_}7qf-4vfMDBJOcFW!7xF{Y zC0~uY6LYT4!qdI;E9bWwp`*zdGQuDf^*cDDS4vl0Jb_N_yUS}QGVt_gFoe=q^aBiu z?z}$KH4MgueaLb<7hmb$>k&mp*{6B73H!r0FllzNdXY%Qeq@%p(0Z0ctXRLTz($>6 z0<^{o4gYoXy}9gTJYsrpKxF$trfA;&peA%blJjm}^B<+>wZPx3=<_+V09ia+-MQ~yvT)*C`uRBs+ zf80{KWsW}uGQ8);l;)K(^*vPWa<{@N~PIk^-mA5qo`ju$7@4p56bmr-*Cx+vV(dKs)Q{<0^NZqvEj!p7rr$CibH7SKsHSrAY=wx<9Xf33tm$gUtXQ?`*M}2!2&`u;J3`|0|th zxt7fcF5gU*_vy0#+ayQQR>uK^E@by&BS=>OQO#P3keOnq#sFvHT|CXySyY#HV>jkd z@cY_S9>4uOnSRP=U4ZS?H^YA$-eJc3WE2h}TE9DyQVRi(f7!CW#m~>ZA^ZV^2mRJy zF0@^Z2_$XqI$_UasOZ zoFVCWAVgFQZm!*jagH_WAE@~541gJzDD8yER%eb2Fv<`ygVF-(e%CNAkXGLJBoA&B z+|P&oe7q!Lc{J`Hyp57dvA$eW!BbR4)aBf6-4CEY(lrArtft|ROkTS`t~aX~v2xtW z5@}%{q4s@jD?T6J($kC~!DW0HA+f7CZF*QfX-(xLB^kY}4A5MYi%BW(=#qOFmY!|LIOE~!$%YQh3eFu2 z=T&gVe5DgH?cISy0#yr1mZY6oi5#@2#;y-F9)|Jb;89VCSHAext&?X_cq^c_cpE<^ z-l`wU)qgv{L$v~m=G@g>0#S@!F!Zfg+2r=!5Ux5y`<;{0J z<}O=hk#WRsa~f`Qm@XCFJA6=tBxK+>?dGZ(+@1R((k9F}A+@=`G%;(vbaJA2{OX+# z)B`5Q2D2~Xe5LpvPOe^ZXTRA)OCmxtOAGUq`$bpJ@Q?&-zO+efS`_iX3+CkLlo7esxQL2z0awmS=ce$k~Owp+HB306Io^=hZso|2phwk zrfOYV4OUVg-rcr4XyCY`i?I(KY!$k~bx+}8W-Z>pwFQeM6jV~3DnC?WFq*x+S+Z%l zpZH9Upt`JvhM<$Dp{4g`*^sR5$5dAfR_~qPuF51XlVaPoPE*PFV>bO>TeH3>v1zG; z`{X-}u-LV}hANTlte3R9r5zOwzOQQc(RkC6wb|+~MCgX&!hg^_?! zL-(BifJHYY4<4f@0qn^4-mJFt)q_ww_JTw&S9W!enn;qtd^^Tt^~UE+N*=C@Qdsr@ zXsMaV*hP=7szc`1fllXrjMH9lPAI7_`8mf!!+Or&6CHB@j_6<&VmE*GQ~9b6R|wjH z)YL*_?iBtL=QSXDL1urpaQ}($NC^>D9nXQ))#4qsOd3r?n?^t1G zpLh0J9fo?e1fFyDb0*>B(=FwBEk0o2FI|;Rc&RbN7+4X0r>H-8v_hK?A8P15L2p+o)l2$b-B54-Bgn&S$zM|)9Qj?zmVL|zE2w8euSdP<+0aYR z)+ZU{Y2G$*C%hylbfp7zi3kmi*SPVNyYuw7kpn67W==6I(kIaZRYaW5YI-S= z>b5{MEtqE8Q&`$&>c#flqa;T0wNDsMO$^Uc*X7}Cryj7O@mFqoWGE+jz|rGwgPh>Q zaUBq~(ovr&5xyPP+B=$h^fn#ADA|WIxT&V`#@@%y-PJUkh!@#wL%ShqT@gtSdJ*;B zWF($fyM+6P*~Rm*xZY@r)_Qf)T&ir;gp;x1r*(tV)!1MK*rlGFg! zc=jXOgH{=l#v@-y&Kdl{cEHB+M&b;7Fh$M{t0+HcjrkrF0=G!n=kH&Ro>>Y>9$u7` z3rI67;YH>Lg<}ovMMF8;HpVU`gh>o$l44#5hlDVmdRkJl4v2vG%=dmFRp;HK1CB%e zbQsWm0dW~IhQ8fW_=^_MC5{4Y-tl-Hz3H%I9r#uI)3Isl4%v#4UALKY!eQU*+ws2z zekAoLZw_J`TwJj3R1Mh6k^NXkI#mN zmb*598N+731!}bgY$5}27jTwjEFLqFGMiFbCqVDX2@;%JcK@JfNZqsSr88h7N`kGG zFu2Q4)RtqT7~WPMox9$Y=6P@BDjUu!w@4#NYy;e9QG0-5xPSHT{`{tR7Sa`Ad@D&z z4hyKAbgB)5SV5Y=kTspG8ysx8s7$x&`G}A@Y*CCFtPp`_Pl1UXU_BSB=8! z6?P2jUO)x|j5O~s7()?^#;E`);JU*R*o(FHY~~^LqCBUfw(;W4X9C$g(=kM zGnCtxtxJEv5f$VQuWy%O7KQ5Ukk_(-J3Nc(7DV=H3jjme{=^ZG^16I73#*`7NC`rh z_9Jnd!8W7@L_WOua_$`^h#@b>7Dx~t2$XhtI=ZNtCj}*O7q8U=wN?oFm3aKoRGk?Iu~gj_AYh5c=}&h_zOQu!=PpH;pY z71Ip14Y93o6sy&?Z^udik|~hwi!iGrAyuF8fuK9`nUPp$oUW0Yw`9BJ4OgoI9Uu&I z;}02$0Ac_5q^UvgJR!-*?&47P^}6XZmw-gnCx?oA zO)!twd6@OMJA%=T@qON7WaqZZVVZvXa1epw?$F_)Yyzoqg(1BN1HbAZX-jXVq}^c) zESTa?J6e7XTndFl&rr~}m%U&bOsPPf&V`kb)gkU3c?1sqL^{FB*M+p8cDl=6y8$ak zIG?@;zykKCL}QOV;4wn25nkk;#=4(dax=A3oasZUYum1tTdhd1Igd^tmx6+~c*snu zR$G+9c(IKwYGY}=Jg+;~>6T-`t!6?^)5~vO9Wr>PmhQCS#0$6{!&Xnyj`l{}##%WC z*neu+CW*bBuvC8#9a#n{!?Up;(4N-}z1 zl41_)xVD!w(DManw|pIU6q&{3Sjt(ejFfss76Ya>u|HB8?48&5v{V&We-1{I2N*zb z-ZAhqST&R~cRjP5;W|UFb_kU}Of2cIz0)G>YiO?rViX=Yau1x`JK-1IyMbZFUy>Rl zZ8%PitPNCYCI+M~Tjc(Q9}qDTRM)Xi-nu)bJqLtTHKR<+)pb;yrUe5`|LB#p;~gibJj zqAtUlSK}*n>5-(?)@uTPNpDoMk^jTl!ee}?4LTZ6VKKF)kYPB_aac_9OZItk4ufvo z@A-`wQWfelHs}~TZu?!2V4lBlG0)n4F@2h*>R)1f zJ)LfOA_oIk&$mAWnc5Wl;UI*w?{jAE=pUj6C-5LHN`EOcnVh(o`a? ztnb%E(-;NocBr5aJkY*+W5M0$0I(I+YoA;9sDzzjWY=ElA+_V$z-1*I;i2}MJ75~jnezTIsD2x>jRP=nYT1U5(w1G74JA3jSUS?c{kYE~j+j4jr!2s8DR zgNr6hhA1zfS)fT5vl;kTn#e^k9>kKMA?1UnNs6>a6+|CFLxK#XOk=&Zr$t1!ACi|Z zMh|%T&oS>%xVmCe0I^o^qt{!%zLa$H80Um%3~>RDwHnnl6B~3e-Kq2TeVgHEgS+d2 zXA8@!0vy!H6Oa4QLRZTtYb8BzQyacBA8S7hilPko`}96Ff5uzzM{tMps7%GU2pnFY z+kIeGl?MxcPC?^~^g~tL8LXLO{&wOLRgLPlJBgJySrH;n7&8~09oT(H?N&8*TMh0m zIl;VaRdboFByp3+Nn7zLyO-~Ky2{uLFWQs2_mJ$CKP8*Oif0=8F zFzw;||AN9Q-P$f_y_Sk&*CH79F_l^B>9lLWj_3lrxe+On;+H>uyzUl2lU~&BrcVglCtPWsAeM1N#iI zmnPd_z-Mue)z=OWjh7FOd)Sc+qnKJhP`4wVg!xnOl|%tEuXge01`6pVi7JnZvNlSy zI=BqPJQtjJvF@U-Dj`8%aE4ECYRK|_~jrIlQ0#@dI$gK4i|OX zb&F&+Xga8z4Uck`{l9Oxh;M$aJOn{_L9cJp4FA~t-TeDPE*Kjw?(JcG+jq|Hkm_QlWK zD=JGrLKqB`r08}UYP0c^u8d`mpo3Q3@M+eF=J$Z6xoY9lj3_!v$egqxK;?} zrYL(Dd8QsM{Z68U7D%SArVgLQoN8jNVnP3JVR!#4k1Iqmo+wsMa|_Jm6=vyZ8NExAtj*NX0XmO&OU0T+t7HatFS}2)?Yl=sQEifuV$u zSaYPY4-s~LAUZB(c(t*t#R&yxh2_j>tweeU8flxL+UYvX$hHG}g-RiD^Ct4l@DkKX zq`Mrv=^MmNMp!EB8rSzBeTYT|yPJpNW*gry5OnMwzK#;YF;Qj@Lip)Ve-5^@nz^?W zX0k0dv%vPTag*5cThAY&p1k}{rVKXhm2{{qU;1OsZl3j5?WaJ4p|Z!#4#yfyX}s;7 zal)!)lrh#2S?TTV80LW~m_=ob1o#~yfziiLwxj5(cAEkoDs5X)E~%9X`(|T2k$2Ll z9w{T08aJund}iY9vm?-@_PM_<{|+JpKWqe%t;Ev7f@xM>dFoLa`sqv`n6^y1uwv?d z{1?>8e#l5k-QEtb#U%dOxK~ZY4wa=Aco%S&CnaBgu8}`X#PWrsi=V)JXMLaRTI90& zxuS-)Qiq2HiIPXpHek~2{xWpVZ72>1-C)%yfe=PcUW5|btu?zAgN6Ecc<#^9$)3+o z8APl_y}bB57f*oI-UH2dRgU#rt5HVy{N!931(sIlBRKY9n+_W3&-O8BL#y`p|86qb z-&aleZJ5!~l;N|{DtX@_&s?Fut7>K@@KjDo{OollK*R4J`^e2+AP z-G@3352lZCuTc&_YGO0`o6*#xh}RvsL-)(^gLkVQsUwMt49{Cq}sNCe^%W z8}qMcH0N0Hz+eAl$X+;>(8cY#zHiy>S6n04-|lp8+Z7%#g~9T}P~K5sQWYr7Z6Fe8_-1wvZGs1_M7U!YylGBt(R;c~QsOeI4z2PIcj`$>7$M7qvvSPV zjeip5)vH5hp~>*sqG&c^V<+J=?@@XX9l-Wn2@WAil`;ghcyNa=Ty0yS2Ha*!Mr~)e zl~D0)vkq&j%E92Xv|-X&1Bt_IERVjkwq`?bEq0wbGQ~0;T>NNxa;j(nmzP2=%eqO7 zqBX>7KP2uiYg~9t#w_EGQ{~0PU`5sr>B$OZsH>2D*3Z-weY)kZ56YuP{-*9n3I7im zGO4<+K9$%k6lczl1oIpbcLv zAyvv$On=?EO`ZS2EKis0GMGH4;lT1c?gxDp%vf_8TFI-AwsTu~YTO2qRl5Hw5tar^ ze}jQmY zkCI-m?((snG6H#KvLtw+@#$jDj~~WVC%l1xS>;UH?YR9_1p|Mic#1SgKmJ_ugd)ht z>ZF*Igq`UL5oaC5A|e8Kqa=emUe^n( zmen<7e)s-7o0FenPCt5MXuXiqlH0{=zU^u-&OS}SS0S zhf2TEp15Axx_t=Q6gOp=U$RbP#t9gg#L=KhB*?IQW110vt=8wF&orq|$7;>lt4vE3 zKfg|y7&=)XV7t5cOhy8UZ_@>wlbeo})15j4zc0^tmCKgXhyVj5LhLyRK|NBFE4ngU z*r46v8NEYcIKM^oy;tYcdR;#T_o?UKg@!x3Kf1}wcYLh>wstnaLm|6qH)s7&>_X{< znbE~U6283L+;Nyx#TYN`8*}Nmeb3Y)*>-ktYdTxC>OrA)qglMC<8 z#^nnZ+-3I&7~QY2u z6)7~{zy9SV>Bxb`X)Ho=j&waG0uW2Ub#qICd*5>4H+u>E(u)|wE z)~RmOqE;z^bPgVY5Fctm5Je(7;>|Nd%PxyM2OggQ9Z92}Q}Lru-Zl2j($VGNv0oP8 z{++2)O+e%3Hb2He9(#du4%+4-4!Dd8rx^MZdelas*WKa-7^5+O3i2O`_m;g%e<7N+-j7+YbdH{ zjri4EEERgA8dmM$w2oVH!Im&xR!@O#;dPCbO$-U++ph2&-JLkg!hR2YB_Lz&Q4eFU zqhEV*xzy|4(pW{Yv;h$pdef=hd4fMR^3yYzc8nj*Nj*0kos~I@jQEr{K@kF5Hq6i& zPx-H68HoDc=&Nn|w$n5ts@JD`A>(@l-9tW!sqW|4z#}$Nmi=P0Ms=fG;+8w2;}{~W(HLay zm}_@x@X99ZII?1JnW{OtP0`z6gI!K&@0z8T`)1R6w>VTZMa@}MX0r0pjgC7d*)a!W z3%wZAWL@mG1pE9 zNZ8J+5HVnFtdqKPw>)xg*F`;>#O4)=1|y!UtQAE&{SAYIWR}<(QiW?}&P2Sus=|Fj zVD9bkt;U=>Drx5JPImn-Ocku(^ziW+bhQ{!v>*F?WKPK)6s*-s=AE!BiJl-gBAUtN zrLPseY+cOor-MbSC8>8$<|~!(-&niXp)P!Ywtw9UcOP9hJe=yf>{^aRwl=#JN&~N0 z6))Ubz3p0OhpyEdoBJzCwhn7F`0Tvw1Y$n1_Cz>dirU?6BC*i%VD=+jH;u1D8|j@} z-5nY&-Ev9NeFuBaHBZ%D&d@%6cdhJ$!L9CkZmH*c3R%gL6rCN|n^s$>xqHtX+vQC| zfy+B8#-B*V_bzyrG@US9UDUInN%zjOyYKnLgU?2^7}VZZJjrw~cYx8;5QcHa&Sps| zCx+?njQ!cW{AcwydwKhR=iQlcbp1R}t8sacf$BlEq8$lq3r4$b@6;w8b-VN9W4!f< zwqsA|73(-DX^LcZ6nUyttaXKefR!ePj&;B-!g@CG^}~KAj}SLGYaWW;`)K2wv%901 z#F&&D)v4{S-JgY{G%#`&Hl|)>Fp&&>X}$F7YKhn`0e!t{tYG6&Uew{byE2F4?y2Ov zvA0M$?2@79byc(CqyK*=>2objyXVYV_=uvbWkLU4x)i*Weu-&piE&75BJeC!s69X` zF7Mt_;?adXshil|fN9>g;ToO;v0U2Y_i@DqFXp9dL@z-6{2ox(ludDV!|yNCu`R8J zs`mAT!=REc(<0{XvKK@+qY@JPP`G#Q93=82*X1o+j1JXN2?4hIa@OBf&1-GPpO8PZ z_s5@r{MSD~2=V1Z5|)d$zWFtr>rV}?Z3l2|n6+=TvV_5;N`HgvvGVy_bOrWbaHDr# zbvPaSm6}3ElIIkLHrRw~;^>$yMjfy0t&9I8$lnv%n67!?5inrq9G30IbYhD+00Lsk zu;KD`&oF|)?M;*=$#gi~Z=oQBirPfq*m9BaFhN=X+U};I?MZ=b59y9rsYQeji&`)R zREKpKF29mM&Pg7q!gE9_&#QrfJ!_66$~$>vBOGf6=5}H}jAyDZ=$nmH{y4VGMeiP? zvw$G&bwDrH>>OlPBHHM+obQO^7?F79ACp#TRy%dF9j-6L4y@RG2zWgZhuw#f7b#{K zlfe+Q0}Xk)#%R65)B$Odb}$-o&9P=3B9#z%lwXJi(Ww4Woqor=XgH6pVx`bjF*!L1 z{ssG&h%CnIt!L{yS=oJJ@}SW(?6Lj~^%xuLuw?^1r?Fe`DG_cp^j2>Ok z+9XC=1Q7r5w%WJD@pqm|mLeIN2ykDpEIectdv4;^Ry~2BASB^oCFsrELZEEOoant# zudnUs2QT?!SS2v(2Q@khuLL@=Z)nPiDjg(1%Odj}V#DM<>e54DW1%lE8GoYlhzsk9 zdMI2BX~YJAdpY{!aLVpx{;r5gMs+=2T{SdqK|~?p{exFMGk0LSjW71w7PN>8pRlYv zt{(TuP#?duuSy177@votqSaDk*#qfclt$eAGeR;ZT3+6F{F^(Xg#@kv%VKkd_nCm)??X8*qB)oGSc3%?8%NQlWyGIGXq|5E(nX--eJDqUeiwh#{5ms#W-=Y{PKA z3Hp!0ej*4M|@g4SptAz*x#r$jhx|>%e$LRijwPv1+kP3uAtnG*w_|~3r8Q%}H83RTc#L<1m zmk-@qayk957~|y=3zn>MLf{_#<;;l>OiSq{FK2`0JnaU_ZgH?3yEr1EfD=n=B5pC?;PtjVbZ@xoZ*p=#MCj z%fgxGZwA#+;qrJ3EdzuF;rl&~r$eOR-_3>Mf;ah4;5t_4F$-pnh|eKa$5s_6&t2)k z`3v{{J4x`k!DbAXkaB~BAOks&*(2|FwH~(!3kfOl`Fu_c$;H8P$12kzM|9{SqN0xj zHcOCngWsYz!LMTsMU5tm6r!lz^xG`@e@CI5Wt}r; ncDDA^b;=xEYs9TKe~v;kk7}yD!36%BIh2i?bgyXdKK1_qu__9^ literal 0 HcmV?d00001 diff --git a/docs/assets/personal-workspace/conversation-pagination/before-desktop.png b/docs/assets/personal-workspace/conversation-pagination/before-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..8acdee571e55e3b44a226595913828c75bd75ed3 GIT binary patch literal 70149 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%0D{q_I<`elnYtt29P&&(%Sd!1U^y&6+6H0s_d0 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 ({message_id: `paged-${index}`, turn_id: null, + role: index % 2 ? "agent" : "user", text: index === 201 ? "原始长文。".repeat(2400) : `原始历史第 ${index} 条。`, + created_at: "2026-08-13T01:00:00Z"})); + const context = await openWorkspacePage(browser, url, { + async beforeGoto(_api, page) { + const runtime = page.__loopxRuntime; + runtime.sessions.clear(); + const session = {session_id: id, goal_id: "loopx-manager", agent_id: "codex", adapter_kind: "codex_app_server", + channel_id: "manager", status: "ready", active_turn_id: null, resumable: true, + created_at: "2026-08-13T01:00:00Z", updated_at: "2026-08-13T01:00:00Z", last_activity_at: "2026-08-13T01:00:00Z", last_error_code: null}; + runtime.sessions.set(id, session); runtime.messages.set(id, rows); + await page.route("**/api/chat/sessions/*", async route => { + const parsed = new URL(route.request().url()); + if (route.request().method() !== "GET" || parsed.pathname !== `/api/chat/sessions/${id}` || !parsed.searchParams.has("message_limit")) return route.fallback(); + const cursor = parsed.searchParams.get("message_cursor"), offset = cursor === "page-200" ? 200 : cursor === "page-400" ? 400 : 0; + pages.push(offset); + if (offset === 200 && failSecond) { + if (!held) { held = true; secondStarted.resolve(); await releaseSecond.promise; } + return route.fulfill({status: 503, json: {error: "Synthetic interrupted second page"}}); + } + await route.fulfill({json: {ok: true, schema_version: "loopx_chat_store_v1", session, active_turn: null, + messages: rows.slice(offset, offset + 200), message_page: {schema_version: "loopx_chat_message_page_v1", + offset, total: rows.length, snapshot_sha256: "a".repeat(64), next_cursor: offset === 0 ? "page-200" : offset === 200 ? "page-400" : null}}}); + }); + }, + }); + const {page, api} = context; + try { + await page.getByRole("navigation", {name: "管家视图"}).getByRole("button", {name: /^(Chat|对话)$/}).click(); + await Promise.race([secondStarted.promise, new Promise((_, reject) => setTimeout(() => reject(new Error("The second original history page was not read")), 5000))]); + const composer = page.getByLabel("向 LoopX 发送消息"); + await composer.fill("分页恢复期间保留这条草稿。"); + assert.equal(await page.getByRole("button", {name: "发送", exact: true}).isEnabled(), false); + releaseSecond.resolve(); + await page.getByText("正在恢复当前会话,恢复后可以继续发送。", {exact: true}).waitFor({state: "visible"}); + assert.equal(await page.getByText(rows[0].text, {exact: true}).count(), 0, "A partial first page cannot masquerade as complete history"); + failSecond = false; + await page.getByRole("button", {name: "重试读取", exact: true}).click(); + await page.getByText(rows[450].text, {exact: true}).waitFor({state: "visible"}); + assert.equal(await page.getByText(rows[0].text, {exact: true}).count(), 1); + assert.equal(await page.getByText(rows[201].text, {exact: true}).count(), 1, "Keep the entire original long body across pages"); + assert.equal(await composer.inputValue(), "分页恢复期间保留这条草稿。"); + await page.waitForFunction(() => !document.querySelector('button[aria-label="发送"]')?.disabled); + assert.deepEqual(pages.slice(-3), [0, 200, 400]); + assert.equal(api.turnRequests.length, 0, "History paging and retry cannot replay or dispatch business"); + await page.setViewportSize({width: 390, height: 844}); + assert.ok(await page.locator("body").evaluate(body => body.scrollWidth <= innerWidth + 1)); + } finally { releaseSecond.resolve(); await context.close(); } +} + async function overlappingHistoryRefresh(browser, url) { const currentId = "session-manager-loopx-manager-codex", oldId = "older-overlap-session", turnId = "overlap-recovered-turn"; const staleRead = Promise.withResolvers(), staleStarted = Promise.withResolvers(), staleSettled = Promise.withResolvers(), stream = Promise.withResolvers(); @@ -215,6 +270,7 @@ async function recoveryObserverHandover(browser, url) { export const conversationHistoryRecoveryScenario = { id: "conversation-history-recovery", async run({ browser, collectCoverage, url }) { + await pagedHistoryRecovery(browser, url); await overlappingHistoryRefresh(browser, url); const currentId = "session-manager-loopx-manager-codex"; const oldId = "previous-worker-session"; diff --git a/loopx/capabilities/manager_context/presentation.py b/loopx/capabilities/manager_context/presentation.py index acc6bd9f45..b296bf9761 100644 --- a/loopx/capabilities/manager_context/presentation.py +++ b/loopx/capabilities/manager_context/presentation.py @@ -13,20 +13,32 @@ from ...control_plane.collaboration.inbox import controlled_request_readback -def project_collaboration(store, root, session_id, messages, *, registry): +def project_collaboration(store, root, session_id, messages, *, registry, context_messages=None): session = store.load_session(session_id) if not session or not conversation_scope(session)["private_conversation"]: return messages # Prefer the saved answer; when it was lost, keep the commitment on the # original user message. Never append a synthetic answer or mutate Chat. carriers, turns = {}, {} - for message in messages: + for message in messages if context_messages is None else context_messages: tid = message.get("turn_id") if not tid or message.get("origin") == "manager_followup": continue if message.get("role") in {"agent", "assistant"} or tid not in carriers: carriers[tid] = message.get("message_id") - if tid not in turns: + visible_ids = {message.get("message_id") for message in messages} + if context_messages is not None: + # A returned result may be on a later page than its commitment. Read + # that original carrier for revision labels, without rendering it twice. + returned_turns = {message.get("turn_id") for message in messages + if isinstance(message.get("return_delivery"), dict)} + messages = [message for message in context_messages + if message.get("turn_id") in returned_turns + and carriers.get(message.get("turn_id")) == message.get("message_id") + and message.get("message_id") not in visible_ids] + messages + for message in messages: + tid = message.get("turn_id") + if tid and carriers.get(tid) == message.get("message_id") and tid not in turns: turns[tid] = store.load_turn(session_id, tid) or {} missing_clients = { turn.get("client_turn_id") for turn in turns.values() @@ -147,4 +159,4 @@ def safe(value): return [{**message, "return_delivery": {**message["return_delivery"], "request_revision": revision_labels[message["message_id"]]}} if message.get("message_id") in revision_labels and isinstance(message.get("return_delivery"), dict) - else message for message in result] + else message for message in result if message.get("message_id") in visible_ids] diff --git a/loopx/capabilities/manager_context/roundtrip.py b/loopx/capabilities/manager_context/roundtrip.py index c2886c4bea..05c5bae530 100644 --- a/loopx/capabilities/manager_context/roundtrip.py +++ b/loopx/capabilities/manager_context/roundtrip.py @@ -282,15 +282,29 @@ def project_chat_return_deliveries(root, session_id, messages): ] -def project_chat_session_snapshot(root, store, session_id, *, registry): +def project_chat_session_snapshot(root, store, session_id, *, registry, + message_limit=None, message_cursor=None): """Project return delivery state into one existing Chat snapshot.""" - snapshot = store.session_snapshot(session_id) + snapshot = (store.session_snapshot(session_id, strict_messages=True) if message_limit is not None + else store.session_snapshot(session_id)) + page = (store.message_page(session_id, snapshot["messages"], limit=message_limit, + cursor=message_cursor) if message_limit is not None else None) + context_messages = snapshot["messages"] + if page is not None: + context_messages = context_messages[:page["message_page"]["total"]] + snapshot["messages"] = page["messages"] snapshot["messages"] = project_chat_return_deliveries( root, session_id, snapshot["messages"] ) from .presentation import project_collaboration - snapshot["messages"] = project_collaboration(store, root, session_id, snapshot["messages"], registry=registry) + # Use the frozen context to choose the carrier, projecting only this page. + # A question and answer can straddle pages without duplicating a commitment + # or re-reading every off-page Turn for each page. + snapshot["messages"] = project_collaboration(store, root, session_id, snapshot["messages"], + registry=registry, context_messages=context_messages) + if page is not None: + snapshot["message_page"] = page["message_page"] return snapshot diff --git a/loopx/chat_server.py b/loopx/chat_server.py index 8a8a04e975..c8bb754eec 100644 --- a/loopx/chat_server.py +++ b/loopx/chat_server.py @@ -923,13 +923,26 @@ def _session_turn(self, session_id: str) -> None: def _session_snapshot(self, session_id: str) -> None: try: + query = parse_qs(urlparse(self.path).query, keep_blank_values=True) + if (set(query) - {"message_limit", "message_cursor"} + or any(len(values) != 1 or not values[0] for values in query.values()) + or ("message_cursor" in query and "message_limit" not in query)): + raise ValueError("invalid history page arguments") + message_limit = int(query["message_limit"][0]) if "message_limit" in query else None + if message_limit is not None and not 1 <= message_limit <= 200: + raise ValueError("message_limit must be between 1 and 200") self.server.runtime_controller.recover_exited_turn(session_id) snapshot = cast(Callable[..., dict[str, object]], project_chat_session_snapshot) self._send_json(snapshot( self.server.runtime_root, self.server.chat_store, session_id, - registry=self.server.registry_path)) + registry=self.server.registry_path, message_limit=message_limit, + message_cursor=query.get("message_cursor", [None])[0])) except KeyError: self._send_error("chat session was not found", status=404) + except ValueError as exc: + self._send_error(str(exc), status=400) + except OSError: + self._send_error("Chat history is temporarily unavailable", status=503) def _managed_native_turn(self, session_id: str, *, execute: bool = False) -> None: from .capabilities.native_chat.steward_managed_mode import ManagedSessionTurn diff --git a/loopx/chat_store.py b/loopx/chat_store.py index 42a81fdf5a..5a5f32b7fd 100644 --- a/loopx/chat_store.py +++ b/loopx/chat_store.py @@ -2,6 +2,7 @@ from __future__ import annotations +import base64 from bisect import bisect_right from datetime import datetime, timedelta, timezone import hashlib @@ -846,8 +847,9 @@ def append_message( _append_jsonl(path, payload) return payload - def messages(self, session_id: str) -> list[dict[str, Any]]: - return _read_jsonl(self._session_dir(session_id) / "messages.jsonl") + def messages(self, session_id: str, *, strict: bool = False) -> list[dict[str, Any]]: + return _read_jsonl(self._session_dir(session_id) / "messages.jsonl", + raise_on_error=strict, strict=strict) def prepared_managed_turn_request( self, @@ -1973,7 +1975,42 @@ def public_session(self, payload: dict[str, Any]) -> dict[str, Any]: and payload.get("status") in RESUMABLE_SESSION_STATES, } - def session_snapshot(self, session_id: str) -> dict[str, Any]: + def message_page(self, session_id: str, messages: list[dict[str, Any]], *, + limit: int, cursor: str | None = None) -> dict[str, Any]: + """Page an append-ordered frozen prefix; a cursor is a read hint, not authority.""" + if type(limit) is not int or not 1 <= limit <= 200: + raise ValueError("message_limit must be between 1 and 200") + offset, total = 0, len(messages) + expected_digest = None + if cursor is not None: + try: + if not isinstance(cursor, str) or not 1 <= len(cursor) <= 1024: + raise ValueError() + decoded = json.loads(base64.b64decode(cursor + "=" * (-len(cursor) % 4), + altchars=b"-_", validate=True)) + source, offset, total, expected_digest = decoded + if (source != session_id or type(offset) is not int or type(total) is not int + or not 0 < offset < total <= len(messages) + or not isinstance(expected_digest, str) + or not re.fullmatch(r"[a-f0-9]{64}", expected_digest)): + raise ValueError() + except (ValueError, TypeError, UnicodeDecodeError) as exc: + raise ValueError("invalid history cursor") from exc + digest = hashlib.sha256(json.dumps(messages[:total], sort_keys=True, + ensure_ascii=False, separators=(",", ":")).encode("utf-8")).hexdigest() + if expected_digest is not None and expected_digest != digest: + raise ValueError("history cursor source changed; restart the read") + end = min(offset + limit, total) + next_cursor = base64.urlsafe_b64encode(json.dumps([session_id, end, total, digest], + separators=(",", ":")).encode("utf-8")).decode("ascii").rstrip("=") if end < total else None + return {"messages": messages[offset:end], "message_page": { + "schema_version": "loopx_chat_message_page_v1", "offset": offset, + "total": total, "snapshot_sha256": digest, "next_cursor": next_cursor, + }} + + def session_snapshot(self, session_id: str, *, message_limit: int | None = None, + message_cursor: str | None = None, + strict_messages: bool = False) -> dict[str, Any]: payload = self.load_session(session_id) if payload is None: raise KeyError("chat session was not found") @@ -1986,10 +2023,17 @@ def session_snapshot(self, session_id: str) -> dict[str, Any]: for key, value in active_turn.items() if key != "_acceptance" } - return { + snapshot = { "ok": True, "schema_version": CHAT_STORE_SCHEMA_VERSION, "session": self.public_session(payload), - "messages": self.messages(session_id), + "messages": (self.messages(session_id, strict=True) if strict_messages or message_limit is not None + else self.messages(session_id)), "active_turn": active_turn, } + if message_limit is not None: + snapshot.update(self.message_page(session_id, snapshot["messages"], + limit=message_limit, cursor=message_cursor)) + elif message_cursor is not None: + raise ValueError("history cursor requires message_limit") + return snapshot diff --git a/tests/test_chat_conversation_bindings.py b/tests/test_chat_conversation_bindings.py index 20d938dc6b..610d0da04e 100644 --- a/tests/test_chat_conversation_bindings.py +++ b/tests/test_chat_conversation_bindings.py @@ -6,10 +6,111 @@ from test_chat_ordinary_project import ordinary # noqa: F401, F811 from test_native_steward_private import steward # noqa: F401 +from test_manager_context_roundtrip import flow # noqa: F401 from loopx.capabilities.native_chat.conversation_bindings import ChatConversationBindings from loopx.extensions.lark.conversation_identity import identity_ref +def _history_page_brief(): + return {"schema_version": "collaboration_brief_v0", "purpose": "Inspect original history", + "context": "Keep the original conversation", "constraints": ["Do not publish"], + "inputs": [], "acceptance": ["Return the original conclusion"], "return_requirement": "Return here"} + + +def test_history_page_keeps_one_original_collaboration_carrier(flow, monkeypatch): + from loopx.capabilities.manager_context.roundtrip import project_chat_session_snapshot + + root, registry, store, create = flow + session, turn, _ = create(brief=_history_page_brief()) + sid, tid = session["session_id"], turn["turn_id"] + for i in range(200 - len(store.messages(sid))): + store.append_message(sid, role="user", text=f"Independent history row {i}") + answer = store.append_message(sid, role="agent", text="Original answer", turn_id=tid) + load_turn, reads = store.load_turn, [] + def observed(*args): + reads.append(args) + return load_turn(*args) + monkeypatch.setattr(store, "load_turn", observed) + first = project_chat_session_snapshot(root, store, sid, registry=registry, message_limit=200) + assert reads == [], "A page without the original carrier must not project off-page Turns" + assert not any(row.get("collaboration") for row in first["messages"]) + store.append_message(sid, role="agent", text="Later answer outside frozen prefix", turn_id=tid) + second = project_chat_session_snapshot(root, store, sid, registry=registry, + message_limit=200, message_cursor=first["message_page"]["next_cursor"]) + assert len(second["messages"]) == 1 and second["message_page"]["next_cursor"] is None + assert second["messages"][0]["message_id"] == answer["message_id"] + assert second["messages"][0]["collaboration"]["agent_id"] == "worker" + assert reads == [(sid, tid)] + + +def test_return_delivery_readback_survives_a_separate_history_page(flow): + from loopx.capabilities.manager_context import acknowledge + from loopx.capabilities.manager_context.roundtrip import drain, report, project_chat_session_snapshot + + root, registry, store, create = flow + session, turn, receipt = create(brief=_history_page_brief()) + sid = session["session_id"] + store.append_message(sid, role="agent", text="Original commitment", turn_id=turn["turn_id"]) + acknowledge(root, "research", "worker", receipt["request_id"], "adopt", "Keep original audience") + report(root, "research", "worker", receipt["request_id"], "conclusion", "Original conclusion") + drain(root, registry, store, lambda *_: pytest.fail("A private App return must not send to a provider")) + expected = project_chat_session_snapshot(root, store, sid, registry=registry)["messages"] + assert len(expected) == 4 and expected[-1].get("return_delivery") + cursor, rows = None, [] + while True: + page = project_chat_session_snapshot(root, store, sid, registry=registry, + message_limit=1, message_cursor=cursor) + rows.extend(page["messages"]) + cursor = page["message_page"]["next_cursor"] + if cursor is None: + break + assert rows == expected + assert sum(bool(row.get("collaboration")) for row in rows) == 1 + + +def test_original_history_pages_freeze_append_boundary_and_keep_full_rows(ordinary, monkeypatch): + from urllib.parse import urlencode + from loopx.chat_server import ChatHTTPServer + + store, runtime, contexts, request, capture, _, _ = ordinary + monkeypatch.setattr(ChatHTTPServer, "runtime_root", store.root.parent, raising=False) + monkeypatch.setattr(ChatHTTPServer, "registry_path", runtime.registry_path, raising=False) + status, opened = request("/api/chat/sessions", { + "context_kind": "project", "project_ref": contexts.available()[0]["project_ref"], + }) + assert status == 201 + sid = opened["session_id"] + rows = [store.append_message(sid, role="user" if i % 2 == 0 else "agent", + text="完整正文" * 3000 if i == 201 else f"Original message {i}", + turn_id=None, attachments=[{"name": "original.png", "data_url": "data:image/png;base64,AA=="}] if i == 201 else None) + for i in range(451)] + native_before = capture.read_bytes() + path = f"/api/chat/sessions/{sid}" + code, first = request(path + "?message_limit=200") + assert code == 200 and len(first["messages"]) == 200 + assert first["message_page"]["total"] == 451 + cursor = first["message_page"]["next_cursor"] + store.append_message(sid, role="agent", text="Appended during history read") + code, second = request(path + "?" + urlencode({"message_limit": 200, "message_cursor": cursor})) + assert code == 200 and len(second["messages"]) == 200 + code, last = request(path + "?" + urlencode({"message_limit": 200, + "message_cursor": second["message_page"]["next_cursor"]})) + assert code == 200 and last["message_page"]["next_cursor"] is None + assert first["messages"] + second["messages"] + last["messages"] == rows + assert request(path)[1]["messages"][-1]["text"] == "Appended during history read" + assert request(path + "?message_limit=200")[1]["message_page"]["total"] == 452 + assert capture.read_bytes() == native_before, "History reads must not execute or replay a Turn" + for query in ["message_limit=0", "message_limit=201", "message_limit=2&message_limit=3", + "message_cursor=invalid", "message_limit=2&message_cursor=invalid"]: + assert request(path + "?" + query)[0] == 400 + def unreadable(*_, **__): + raise PermissionError("private journal path") + with monkeypatch.context() as patch: + patch.setattr(store, "messages", unreadable) + code, unavailable = request(path + "?message_limit=200") + assert code == 503 and "private journal path" not in json.dumps(unavailable) + + def test_app_steward_corrupt_legacy_configuration_never_falls_back(tmp_path): bindings = ChatConversationBindings(root=tmp_path, project_contexts=None, observe=lambda _: pytest.fail("an unselected entry must not probe a provider")) diff --git a/tests/test_chat_store_input_validation.py b/tests/test_chat_store_input_validation.py index 499b79467c..0e3537bfc1 100644 --- a/tests/test_chat_store_input_validation.py +++ b/tests/test_chat_store_input_validation.py @@ -51,6 +51,33 @@ def _dedup_store(tmp_path: Path) -> tuple[ChatSessionStore, str]: return store, session_id +def test_history_cursor_rejects_other_session_and_rewritten_prefix(tmp_path: Path) -> None: + store, sid = _dedup_store(tmp_path) + for i in range(5): + store.append_message(sid, role="user", text=f"row {i}") + page = store.session_snapshot(sid, message_limit=2) + cursor = page["message_page"]["next_cursor"] + other = store.create_session(goal_id="goal-one", agent_id="codex", + adapter_kind="codex_app_server", upstream_thread_id="other", upstream_mode="chat")["session_id"] + with pytest.raises(ValueError, match="cursor"): + store.session_snapshot(other, message_limit=2, message_cursor=cursor) + path = store._session_dir(sid) / "messages.jsonl" + original = path.read_bytes() + rows = store.messages(sid) + rows[0]["text"] = "Rewritten source" + path.write_text("".join(json.dumps(row) + "\n" for row in rows)) + with pytest.raises(ValueError, match="cursor"): + store.session_snapshot(sid, message_limit=2, message_cursor=cursor) + path.write_bytes(original + b"{broken record}\n") + with pytest.raises(ValueError, match="journal record"): + store.session_snapshot(sid, message_limit=2) + path.write_bytes(original) + assert store.session_snapshot(sid, message_limit=2, message_cursor=cursor)["messages"] == store.messages(sid)[2:4] + path.write_text("\n".join(path.read_text().splitlines()[:3]) + "\n") + with pytest.raises(ValueError, match="cursor"): + store.session_snapshot(sid, message_limit=2, message_cursor=cursor) + + def test_same_message_id_same_payload_returns_existing_row(tmp_path: Path) -> None: store, session_id = _dedup_store(tmp_path) first = store.append_message( From ea34ecc841c7d18a7466dac23e74876db6c500cb Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 26 Oct 2026 19:10:26 +0800 Subject: [PATCH 2/2] refactor(chat): keep stateless history paging outside the store facade Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../capabilities/manager_context/roundtrip.py | 3 +- loopx/chat_history.py | 42 ++++++++++++++++ loopx/chat_store.py | 48 ++----------------- tests/test_chat_store_input_validation.py | 13 ++--- 4 files changed, 54 insertions(+), 52 deletions(-) create mode 100644 loopx/chat_history.py diff --git a/loopx/capabilities/manager_context/roundtrip.py b/loopx/capabilities/manager_context/roundtrip.py index 05c5bae530..e3232fd7c3 100644 --- a/loopx/capabilities/manager_context/roundtrip.py +++ b/loopx/capabilities/manager_context/roundtrip.py @@ -288,7 +288,8 @@ def project_chat_session_snapshot(root, store, session_id, *, registry, snapshot = (store.session_snapshot(session_id, strict_messages=True) if message_limit is not None else store.session_snapshot(session_id)) - page = (store.message_page(session_id, snapshot["messages"], limit=message_limit, + from ...chat_history import page_chat_messages + page = (page_chat_messages(session_id, snapshot["messages"], limit=message_limit, cursor=message_cursor) if message_limit is not None else None) context_messages = snapshot["messages"] if page is not None: diff --git a/loopx/chat_history.py b/loopx/chat_history.py new file mode 100644 index 0000000000..18322330fc --- /dev/null +++ b/loopx/chat_history.py @@ -0,0 +1,42 @@ +"""Stateless paging of one original Chat transcript; no storage or execution owner.""" +from __future__ import annotations + +import base64 +import hashlib +import json +import re +from typing import Any + + +def page_chat_messages(session_id: str, messages: list[dict[str, Any]], *, + limit: int, cursor: str | None = None) -> dict[str, Any]: + """Page an append-ordered frozen prefix; a cursor is a read hint, not authority.""" + if type(limit) is not int or not 1 <= limit <= 200: + raise ValueError("message_limit must be between 1 and 200") + offset, total = 0, len(messages) + expected_digest = None + if cursor is not None: + try: + if not isinstance(cursor, str) or not 1 <= len(cursor) <= 1024: + raise ValueError() + decoded = json.loads(base64.b64decode(cursor + "=" * (-len(cursor) % 4), + altchars=b"-_", validate=True)) + source, offset, total, expected_digest = decoded + if (source != session_id or type(offset) is not int or type(total) is not int + or not 0 < offset < total <= len(messages) + or not isinstance(expected_digest, str) + or not re.fullmatch(r"[a-f0-9]{64}", expected_digest)): + raise ValueError() + except (ValueError, TypeError, UnicodeDecodeError) as exc: + raise ValueError("invalid history cursor") from exc + digest = hashlib.sha256(json.dumps(messages[:total], sort_keys=True, + ensure_ascii=False, separators=(",", ":")).encode("utf-8")).hexdigest() + if expected_digest is not None and expected_digest != digest: + raise ValueError("history cursor source changed; restart the read") + end = min(offset + limit, total) + next_cursor = base64.urlsafe_b64encode(json.dumps([session_id, end, total, digest], + separators=(",", ":")).encode("utf-8")).decode("ascii").rstrip("=") if end < total else None + return {"messages": messages[offset:end], "message_page": { + "schema_version": "loopx_chat_message_page_v1", "offset": offset, + "total": total, "snapshot_sha256": digest, "next_cursor": next_cursor, + }} diff --git a/loopx/chat_store.py b/loopx/chat_store.py index 5a5f32b7fd..b7faee7508 100644 --- a/loopx/chat_store.py +++ b/loopx/chat_store.py @@ -2,7 +2,6 @@ from __future__ import annotations -import base64 from bisect import bisect_right from datetime import datetime, timedelta, timezone import hashlib @@ -1975,42 +1974,7 @@ def public_session(self, payload: dict[str, Any]) -> dict[str, Any]: and payload.get("status") in RESUMABLE_SESSION_STATES, } - def message_page(self, session_id: str, messages: list[dict[str, Any]], *, - limit: int, cursor: str | None = None) -> dict[str, Any]: - """Page an append-ordered frozen prefix; a cursor is a read hint, not authority.""" - if type(limit) is not int or not 1 <= limit <= 200: - raise ValueError("message_limit must be between 1 and 200") - offset, total = 0, len(messages) - expected_digest = None - if cursor is not None: - try: - if not isinstance(cursor, str) or not 1 <= len(cursor) <= 1024: - raise ValueError() - decoded = json.loads(base64.b64decode(cursor + "=" * (-len(cursor) % 4), - altchars=b"-_", validate=True)) - source, offset, total, expected_digest = decoded - if (source != session_id or type(offset) is not int or type(total) is not int - or not 0 < offset < total <= len(messages) - or not isinstance(expected_digest, str) - or not re.fullmatch(r"[a-f0-9]{64}", expected_digest)): - raise ValueError() - except (ValueError, TypeError, UnicodeDecodeError) as exc: - raise ValueError("invalid history cursor") from exc - digest = hashlib.sha256(json.dumps(messages[:total], sort_keys=True, - ensure_ascii=False, separators=(",", ":")).encode("utf-8")).hexdigest() - if expected_digest is not None and expected_digest != digest: - raise ValueError("history cursor source changed; restart the read") - end = min(offset + limit, total) - next_cursor = base64.urlsafe_b64encode(json.dumps([session_id, end, total, digest], - separators=(",", ":")).encode("utf-8")).decode("ascii").rstrip("=") if end < total else None - return {"messages": messages[offset:end], "message_page": { - "schema_version": "loopx_chat_message_page_v1", "offset": offset, - "total": total, "snapshot_sha256": digest, "next_cursor": next_cursor, - }} - - def session_snapshot(self, session_id: str, *, message_limit: int | None = None, - message_cursor: str | None = None, - strict_messages: bool = False) -> dict[str, Any]: + def session_snapshot(self, session_id: str, *, strict_messages: bool = False) -> dict[str, Any]: payload = self.load_session(session_id) if payload is None: raise KeyError("chat session was not found") @@ -2023,17 +1987,11 @@ def session_snapshot(self, session_id: str, *, message_limit: int | None = None, for key, value in active_turn.items() if key != "_acceptance" } - snapshot = { + return { "ok": True, "schema_version": CHAT_STORE_SCHEMA_VERSION, "session": self.public_session(payload), - "messages": (self.messages(session_id, strict=True) if strict_messages or message_limit is not None + "messages": (self.messages(session_id, strict=True) if strict_messages else self.messages(session_id)), "active_turn": active_turn, } - if message_limit is not None: - snapshot.update(self.message_page(session_id, snapshot["messages"], - limit=message_limit, cursor=message_cursor)) - elif message_cursor is not None: - raise ValueError("history cursor requires message_limit") - return snapshot diff --git a/tests/test_chat_store_input_validation.py b/tests/test_chat_store_input_validation.py index 0e3537bfc1..60480881f2 100644 --- a/tests/test_chat_store_input_validation.py +++ b/tests/test_chat_store_input_validation.py @@ -7,6 +7,7 @@ import loopx.chat_store as chat_store from loopx.chat_store import CHAT_SESSION_SCHEMA_VERSION, ChatSessionStore +from loopx.chat_history import page_chat_messages def test_agent_model_value_keeps_provider_protocol_characters() -> None: @@ -55,27 +56,27 @@ def test_history_cursor_rejects_other_session_and_rewritten_prefix(tmp_path: Pat store, sid = _dedup_store(tmp_path) for i in range(5): store.append_message(sid, role="user", text=f"row {i}") - page = store.session_snapshot(sid, message_limit=2) + page = page_chat_messages(sid, store.messages(sid, strict=True), limit=2) cursor = page["message_page"]["next_cursor"] other = store.create_session(goal_id="goal-one", agent_id="codex", adapter_kind="codex_app_server", upstream_thread_id="other", upstream_mode="chat")["session_id"] with pytest.raises(ValueError, match="cursor"): - store.session_snapshot(other, message_limit=2, message_cursor=cursor) + page_chat_messages(other, store.messages(other, strict=True), limit=2, cursor=cursor) path = store._session_dir(sid) / "messages.jsonl" original = path.read_bytes() rows = store.messages(sid) rows[0]["text"] = "Rewritten source" path.write_text("".join(json.dumps(row) + "\n" for row in rows)) with pytest.raises(ValueError, match="cursor"): - store.session_snapshot(sid, message_limit=2, message_cursor=cursor) + page_chat_messages(sid, store.messages(sid, strict=True), limit=2, cursor=cursor) path.write_bytes(original + b"{broken record}\n") with pytest.raises(ValueError, match="journal record"): - store.session_snapshot(sid, message_limit=2) + page_chat_messages(sid, store.messages(sid, strict=True), limit=2) path.write_bytes(original) - assert store.session_snapshot(sid, message_limit=2, message_cursor=cursor)["messages"] == store.messages(sid)[2:4] + assert page_chat_messages(sid, store.messages(sid, strict=True), limit=2, cursor=cursor)["messages"] == store.messages(sid)[2:4] path.write_text("\n".join(path.read_text().splitlines()[:3]) + "\n") with pytest.raises(ValueError, match="cursor"): - store.session_snapshot(sid, message_limit=2, message_cursor=cursor) + page_chat_messages(sid, store.messages(sid, strict=True), limit=2, cursor=cursor) def test_same_message_id_same_payload_returns_existing_row(tmp_path: Path) -> None: