feat(web-console): unify spatial UI and chat reset
This commit is contained in:
@@ -13,15 +13,15 @@ def test_console_contains_ai_assistant_surface():
|
||||
assert 'aria-label="AI助手对话"' in html
|
||||
assert 'placeholder="向 AI助手提问或交代工作"' in html
|
||||
assert 'aria-label="发送消息"' in html
|
||||
assert 'href="/assistant-chat.css?v=codex-assistant-28"' in html
|
||||
assert 'src="/assistant-chat.js?v=codex-assistant-32"' in html
|
||||
assert 'href="/assistant-chat.css?v=codex-assistant-29"' in html
|
||||
assert 'src="/assistant-chat.js?v=codex-assistant-33"' in html
|
||||
|
||||
|
||||
def test_codex_assistant_assets_are_versioned_together_in_the_service_worker():
|
||||
service_worker = (ROOT / "apps/web-console/service-worker.js").read_text(encoding="utf-8")
|
||||
assert 'const CACHE_VERSION = "cognitive-agent-pad-v302"' in service_worker
|
||||
assert '"/assistant-chat.css?v=codex-assistant-28"' in service_worker
|
||||
assert '"/assistant-chat.js?v=codex-assistant-32"' in service_worker
|
||||
assert 'const CACHE_VERSION = "cognitive-agent-pad-v305"' in service_worker
|
||||
assert '"/assistant-chat.css?v=codex-assistant-29"' in service_worker
|
||||
assert '"/assistant-chat.js?v=codex-assistant-33"' in service_worker
|
||||
|
||||
|
||||
def test_codex_frontend_uses_one_streaming_endpoint_and_agent_work_events():
|
||||
@@ -121,7 +121,11 @@ def test_starting_a_new_codex_conversation_rotates_the_conversation_id():
|
||||
script = (ROOT / "apps/web-console/assistant-chat.js").read_text(encoding="utf-8")
|
||||
assert 'const CONVERSATION_STORAGE_KEY = "cognitive-agent.conversation-id"' in script
|
||||
assert "function createConversationId()" in script
|
||||
assert "sessionStorage.setItem(CONVERSATION_STORAGE_KEY, createConversationId())" in script
|
||||
assert "const nextConversationId = createConversationId()" in script
|
||||
assert (
|
||||
"sessionStorage.setItem(CONVERSATION_STORAGE_KEY, nextConversationId)"
|
||||
in script
|
||||
)
|
||||
|
||||
|
||||
def test_assistant_uses_the_shared_top_right_dock_and_opens_by_default():
|
||||
@@ -137,7 +141,9 @@ def test_assistant_uses_the_shared_top_right_dock_and_opens_by_default():
|
||||
assert 'trigger.setAttribute("aria-pressed", String(open))' in script
|
||||
assert 'drawer.toggleAttribute("inert", !open)' in script
|
||||
assert 'trigger.className = "assistant-drawer-toggle v2-panel-control-button"' in script
|
||||
assert '($("#v2PanelControlDock") || document.body).append(trigger)' in script
|
||||
assert 'const panelDock = $("#v2PanelControlDock")' in script
|
||||
assert "panelDock.insertBefore(trigger, firstRightPanelToggle)" in script
|
||||
assert "document.body.append(trigger)" in script
|
||||
assert 'id = "assistantDrawerClose"' not in script
|
||||
assert "setDrawerOpen(true)" in script
|
||||
assert 'event.key === "Escape"' in script
|
||||
@@ -252,8 +258,8 @@ def test_latest_same_name_mode_draft_retires_stale_card_and_lifecycle_clears_con
|
||||
"async function tryModeProfileDraft", 1
|
||||
)[0]
|
||||
new_conversation_flow = assistant.split(
|
||||
'if (!target?.closest("#newConversation")) return;', 1
|
||||
)[1].split("}, true);", 1)[0]
|
||||
"function resetConversation()", 1
|
||||
)[1].split("function initialize()", 1)[0]
|
||||
|
||||
assert "card.dataset.assistantModeName !== nextName" in replace_flow
|
||||
assert "card.dataset.assistantModeDraft === nextRequestId" in replace_flow
|
||||
@@ -266,6 +272,32 @@ def test_latest_same_name_mode_draft_retires_stale_card_and_lifecycle_clears_con
|
||||
assert ".assistant-mode-draft-status.superseded" in css
|
||||
|
||||
|
||||
def test_new_conversation_resets_chat_in_place_and_keeps_panel_order_spatial():
|
||||
app = (ROOT / "apps/web-console/app.js").read_text(encoding="utf-8")
|
||||
assistant = (ROOT / "apps/web-console/assistant-chat.js").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
reset_flow = assistant.split("function resetConversation()", 1)[1].split(
|
||||
"function initialize()", 1
|
||||
)[0]
|
||||
app_flow = app.split("function startNewConversation", 1)[1].split(
|
||||
"window.CognitiveAgentConsole", 1
|
||||
)[0]
|
||||
|
||||
assert 'activeController.abort("new_conversation")' in reset_flow
|
||||
assert "sessionStorage.removeItem(STORAGE_KEY)" in reset_flow
|
||||
assert "renderInitialMessages()" in reset_flow
|
||||
assert "setComposerPending(false)" in reset_flow
|
||||
assert '"cognitive-agent:new-conversation"' in reset_flow
|
||||
assert "window.location.reload()" not in app_flow
|
||||
assert (
|
||||
'window.addEventListener("cognitive-agent:new-conversation", '
|
||||
"startNewConversation)"
|
||||
) in app
|
||||
assert 'const firstRightPanelToggle = $("[data-panel-toggle]", panelDock)' in assistant
|
||||
assert "panelDock.insertBefore(trigger, firstRightPanelToggle)" in assistant
|
||||
|
||||
|
||||
def test_assistant_composer_grows_to_a_cap_then_scrolls_its_own_content():
|
||||
assistant = (ROOT / "apps/web-console/assistant-chat.js").read_text(encoding="utf-8")
|
||||
css = (ROOT / "apps/web-console/assistant-chat.css").read_text(encoding="utf-8")
|
||||
@@ -383,6 +415,18 @@ def test_chat_styles_include_accessible_responsive_and_reduced_motion_states():
|
||||
assert "@media (prefers-reduced-motion: reduce)" in css
|
||||
|
||||
|
||||
def test_dispatched_control_card_spans_the_full_assistant_message_row():
|
||||
css = (ROOT / "apps/web-console/assistant-chat.css").read_text(encoding="utf-8")
|
||||
layout = css.split("/* Compact command receipt", 1)[1].split(
|
||||
"/* The function-mode strip", 1
|
||||
)[0]
|
||||
|
||||
assert "grid-template-columns: 30px minmax(0, 1fr)" in layout
|
||||
assert "display: contents" in layout
|
||||
assert "grid-column: 1 / -1" in layout
|
||||
assert "max-width: none" in layout
|
||||
|
||||
|
||||
def test_assistant_does_not_restore_collapsed_sidebars_and_uses_mobile_overlays():
|
||||
script = (ROOT / "apps/web-console/assistant-chat.js").read_text(encoding="utf-8")
|
||||
css = (ROOT / "apps/web-console/assistant-chat.css").read_text(encoding="utf-8")
|
||||
|
||||
Reference in New Issue
Block a user