fix(ui): stabilize workplace chat scrolling

This commit is contained in:
LZH-YS1998
2026-07-13 23:02:39 +08:00
parent 4e7aa75ba5
commit 4bc18dcd27
46 changed files with 5937 additions and 1258 deletions
+97
View File
@@ -0,0 +1,97 @@
"""Shared visibility rules for persisted session transcript messages.
The database pager and the Office UI renderer must agree on this boundary.
If either side independently classifies transcript kinds, a summary request can
page over rows that the renderer later drops and leave the caller with a cursor
that never advances through the visible timeline.
"""
from __future__ import annotations
from typing import Any, Literal, Mapping
TranscriptDetailLevel = Literal["summary", "full"]
FULL_DETAIL_ONLY_TRANSCRIPT_KINDS: frozenset[str] = frozenset({
"runtime_v2_user_turn",
"runtime_v2_intermediate_assistant",
"runtime_v2_company_assistant",
"runtime_v2_tool_output",
})
def normalize_transcript_detail_level(value: Any) -> TranscriptDetailLevel:
return "full" if str(value or "").strip().lower() == "full" else "summary"
def transcript_metadata_visible(
metadata: Mapping[str, Any] | None,
*,
detail_level: TranscriptDetailLevel | str = "summary",
) -> bool:
"""Return whether a persisted transcript row belongs to a detail view.
``company_final_turn`` deliberately overrides the kind classification: a
company role's final reply is the durable user-visible result even when its
transport kind is normally reserved for the full execution transcript.
"""
if normalize_transcript_detail_level(detail_level) == "full":
return True
normalized_metadata = dict(metadata or {})
if normalized_metadata.get("company_final_turn") is True:
return True
kind = str(normalized_metadata.get("kind", "") or "").strip()
return kind not in FULL_DETAIL_ONLY_TRANSCRIPT_KINDS
def transcript_visibility_sql(
*,
detail_level: TranscriptDetailLevel | str,
metadata_column: str = "metadata",
) -> tuple[str, tuple[str, ...]]:
"""Build the SQLite predicate equivalent of ``transcript_metadata_visible``.
``metadata_column`` is supplied only by internal, static query construction;
callers must not pass user-controlled identifiers.
"""
if normalize_transcript_detail_level(detail_level) == "full":
return "", ()
placeholders = ",".join("?" for _ in FULL_DETAIL_ONLY_TRANSCRIPT_KINDS)
predicate = (
"AND (COALESCE(json_extract("
f"{metadata_column}, '$.company_final_turn'), 0) = 1 "
"OR COALESCE(json_extract("
f"{metadata_column}, '$.kind'), '') NOT IN ({placeholders})) "
)
return predicate, tuple(sorted(FULL_DETAIL_ONLY_TRANSCRIPT_KINDS))
def rendered_transcript_metadata_visible(
metadata: Mapping[str, Any] | None,
*,
detail_level: TranscriptDetailLevel | str = "summary",
) -> bool:
"""Apply the visibility marker written by the transcript renderer."""
if normalize_transcript_detail_level(detail_level) == "full":
return True
visibility = str(dict(metadata or {}).get("detail_visibility", "summary") or "summary")
return visibility.strip().lower() != "full"
def rendered_transcript_visibility_sql(
*,
detail_level: TranscriptDetailLevel | str,
metadata_column: str = "metadata",
) -> str:
"""SQLite predicate equivalent of ``rendered_transcript_metadata_visible``."""
if normalize_transcript_detail_level(detail_level) == "full":
return ""
return (
" AND lower(COALESCE(json_extract("
f"{metadata_column}, '$.detail_visibility'), 'summary')) != 'full'"
)