Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/amber1686855908-hash_neuro-code.json
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
175 KiB
JSON

{"repo": "amber1686855908-hash/neuro-code", "files": {"tests/test_tui.py": {"37f2ff235331a39e5c0f0a78ee92f5a7257a077c": {"t": 1786068448.343175, "n": 171444, "h": "9b44536c607590a0", "c": "from __future__ import annotations\n\nimport asyncio\nimport inspect\nimport tempfile\nimport unittest\nfrom dataclasses import replace\nfrom datetime import UTC, datetime\nfrom pathlib import Path\nfrom unittest.mock import patch\n\nfrom pygments.token import Keyword, Name, Number, String\nfrom textual.containers import VerticalScroll\nfrom textual.geometry import Size\nfrom textual.widgets import Button, Input, Label, Static\n\nfrom neuro_code.adapters.provider_settings import JsonProviderSettingsStore\nfrom neuro_code.application.permissions.contracts import (\n PermissionApproval,\n PermissionApprovalKind,\n build_permission_request,\n)\nfrom neuro_code.application.ports.http import HttpClientPolicy\nfrom neuro_code.application.runtime.agent import AgentRunResult, EventSink\nfrom neuro_code.application.runtime.approval import SessionApprovalBroker\nfrom neuro_code.application.runtime.profile_conversation import (\n InteractionModeSelectionResult,\n ProviderOption,\n ProviderSelectionResult,\n ReasoningEffortSelectionResult,\n SessionOption,\n SessionSelectionResult,\n)\nfrom neuro_code.domain.background_tasks import (\n BackgroundTaskSnapshot,\n BackgroundTaskStatus,\n BackgroundTaskWakePolicy,\n BackgroundWakeLimits,\n BackgroundWakeState,\n)\nfrom neuro_code.domain.events import AgentEvent, AgentEventKind\nfrom neuro_code.domain.execution import (\n AgentExecutionOutcome,\n AgentExecutionStatus,\n SessionExecutionRecord,\n SupervisorReasonCode,\n TurnCancellationPolicy,\n)\nfrom neuro_code.domain.interaction_mode import InteractionMode\nfrom neuro_code.domain.messages import (\n ContentPart,\n ContextItemKind,\n Message,\n PreservedContextItem,\n Role,\n SessionItem,\n ToolCall,\n)\nfrom neuro_code.domain.plans import PlanComment, PlanStep, PlanStepStatus, SessionPlan\nfrom neuro_code.domain.provider_catalog import (\n ProviderCatalogError,\n ProviderCatalogResult,\n ProviderConnectionSpec,\n)\nfrom neuro_code.domain.provider_settings import (\n ManagedProviderProfile,\n ManagedProviderSettings,\n ManagedProxyPolicy,\n)\nfrom neuro_code.domain.reasoning import ReasoningEffort\nfrom neuro_code.domain.sandbox import SandboxProfile\nfrom neuro_code.domain.session_tasks import SessionTask, SessionTaskKind, SessionTaskStatus\nfrom neuro_code.domain.sessions import SessionSummary\nfrom neuro_code.domain.ui_preferences import UiLanguage\nfrom neuro_code.tui import (\n TUI_RELOAD_PROVIDER_SETTINGS,\n AssistantMarkdown,\n BackgroundWakeSettingsScreen,\n ConversationMessage,\n LanguageSettingsScreen,\n NetworkProxySettingsScreen,\n NeuroCodeApp,\n PermissionApprovalScreen,\n ProviderSelectionScreen,\n ProviderSettingsScreen,\n ProviderSetupApp,\n ReasoningEffortScreen,\n SessionSelectionScreen,\n SettingsScreen,\n ToolFeedbackMessage,\n)\nfrom neuro_code.tui_theme import (\n ACCENT_CODE,\n ACCENT_ERROR,\n ACCENT_LINK,\n ACCENT_NUMBER,\n ACCENT_SUCCESS,\n ACCENT_WARNING,\n BORDER_FOCUS,\n MONO_COLORS,\n MONO_SYNTAX_THEME,\n SURFACE_HOVER,\n SURFACE_SELECTED,\n TEXT_BODY,\n TEXT_EMPHASIS,\n TEXT_PRIMARY,\n TEXT_SECONDARY,\n)\n\n\nclass TuiConversation:\n def __init__(self) -> None:\n self._session_id: str | None = None\n self.prompts: list[str] = []\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del cancellation_policy\n self.prompts.append(prompt)\n self._session_id = \"session-fixture\"\n events = (\n AgentEvent.create(\n 1,\n AgentEventKind.SESSION_STARTED,\n {\"session_id\": self._session_id},\n ),\n AgentEvent.create(2, AgentEventKind.REASONING_DELTA, {\"text\": \"private\"}),\n AgentEvent.create(\n 3,\n AgentEventKind.MODEL_THINKING_COMPLETED,\n {\"step\": 1, \"duration_seconds\": 1.25},\n ),\n AgentEvent.create(\n 4,\n AgentEventKind.TOOL_REQUESTED,\n {\"id\": \"read\", \"name\": \"read_file\", \"arguments\": {\"path\": \"README.md\"}},\n ),\n AgentEvent.create(\n 5,\n AgentEventKind.TOOL_PERMISSION,\n {\n \"id\": \"read\",\n \"name\": \"read_file\",\n \"effect\": \"ask\",\n \"reason\": \"fixture approval\",\n },\n ),\n AgentEvent.create(\n 6,\n AgentEventKind.TOOL_APPROVAL_REQUESTED,\n {\n \"id\": \"read\",\n \"name\": \"read_file\",\n \"summary\": \"private approval summary\",\n \"reason\": \"fixture approval\",\n },\n ),\n AgentEvent.create(\n 7,\n AgentEventKind.TOOL_APPROVAL_RESOLVED,\n {\n \"id\": \"read\",\n \"name\": \"read_file\",\n \"effect\": \"allow\",\n \"outcome\": \"allow_once\",\n \"reason\": \"approved once\",\n },\n ),\n AgentEvent.create(\n 8,\n AgentEventKind.TOOL_COMPLETED,\n {\n \"id\": \"read\",\n \"name\": \"read_file\",\n \"content\": \"1\\tNeuro Code project\\n2\\tPython agent\",\n \"metadata\": {\"path\": \"/workspace/README.md\", \"total_lines\": 2},\n \"duration_seconds\": 0.42,\n },\n ),\n AgentEvent.create(9, AgentEventKind.TEXT_DELTA, {\"text\": \"fixture \"}),\n AgentEvent.create(10, AgentEventKind.TEXT_DELTA, {\"text\": \"response\"}),\n AgentEvent.create(\n 11,\n AgentEventKind.TURN_COMPLETED,\n {\"step\": 1, \"duration_seconds\": 2.75},\n ),\n )\n if sink is not None:\n for event in events:\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\n self._session_id,\n \"fixture response\",\n (),\n (),\n events,\n 1,\n )\n\n async def run_background_wake(self, *, sink: EventSink | None = None) -> AgentRunResult:\n return await self.run(\"background wake\", sink=sink)\n\n\nclass AutoWakeTuiConversation:\n def __init__(self) -> None:\n self._session_id = \"auto-wake-session\"\n self.wake_count = 0\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt, sink, cancellation_policy\n raise AssertionError(\"auto-wake fixture must not start a user turn\")\n\n async def run_background_wake(self, *, sink: EventSink | None = None) -> AgentRunResult:\n self.wake_count += 1\n events = (\n AgentEvent.create(\n 1,\n AgentEventKind.BACKGROUND_TASK_AUTO_WAKE_STARTED,\n {\"count\": 1, \"remaining_count\": 0, \"model_context_only\": True},\n ),\n AgentEvent.create(\n 2,\n AgentEventKind.BACKGROUND_TASK_COMPLETION_REMINDER,\n {\"task_ids\": [\"task-fast\"], \"count\": 1, \"remaining_count\": 0},\n ),\n AgentEvent.create(3, AgentEventKind.TEXT_DELTA, {\"text\": \"wake response\"}),\n AgentEvent.create(\n 4,\n AgentEventKind.TURN_COMPLETED,\n {\"step\": 1, \"duration_seconds\": 0.1},\n ),\n )\n if sink is not None:\n for event in events:\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\n self._session_id,\n \"wake response\",\n (),\n (),\n events,\n 1,\n )\n\n\nclass FailingAutoWakeTuiConversation(AutoWakeTuiConversation):\n async def run_background_wake(self, *, sink: EventSink | None = None) -> AgentRunResult:\n self.wake_count += 1\n reminder = AgentEvent.create(\n 1,\n AgentEventKind.BACKGROUND_TASK_COMPLETION_REMINDER,\n {\"task_ids\": [\"task-fast\"], \"count\": 1, \"remaining_count\": 0},\n )\n if sink is not None:\n outcome = sink(reminder)\n if inspect.isawaitable(outcome):\n await outcome\n raise RuntimeError(\"wake provider failed\")\n\n\nclass ApprovalTuiConversation:\n def __init__(self, broker: SessionApprovalBroker) -> None:\n self._broker = broker\n self._session_id: str | None = None\n self.approvals: list[PermissionApproval] = []\n self.executed = False\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt, sink, cancellation_policy\n request = build_permission_request(\n \"edit\",\n \"search_replace\",\n {\"path\": \"note.txt\", \"old\": \"private-old\", \"new\": \"private-new\"},\n \"interactive approval required\",\n )\n approval = await self._broker.request(request)\n self.approvals.append(approval)\n self.executed = approval.allowed\n self._session_id = \"approval-session\"\n response = \"approved\" if approval.allowed else \"denied\"\n return AgentRunResult(self._session_id, response, (), (), (), 1)\n\n\nclass CancellableTuiConversation:\n def __init__(self) -> None:\n self._session_id: str | None = None\n self.prompts: list[str] = []\n self.started = asyncio.Event()\n self.cancelled = False\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del sink, cancellation_policy\n self.prompts.append(prompt)\n self._session_id = \"cancel-session\"\n self.started.set()\n try:\n await asyncio.Event().wait()\n except asyncio.CancelledError:\n self.cancelled = True\n raise\n raise AssertionError(\"unreachable\")\n\n\nclass PristineRewindTuiConversation:\n def __init__(self) -> None:\n self._session_id: str | None = None\n self.started = asyncio.Event()\n self.cancelled = False\n self.policies: list[TurnCancellationPolicy] = []\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt\n self.policies.append(cancellation_policy)\n self._session_id = \"pristine-rewind-session\"\n self.started.set()\n try:\n await asyncio.Event().wait()\n except asyncio.CancelledError:\n self.cancelled = True\n if sink is not None:\n event = AgentEvent.create(\n 1,\n AgentEventKind.TURN_FAILED,\n {\n \"cancelled\": True,\n \"pristine_rewound\": cancellation_policy\n is TurnCancellationPolicy.REWIND_PRISTINE,\n },\n )\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n raise\n raise AssertionError(\"unreachable\")\n\n\nclass PreTokenInterjectionConversation:\n def __init__(self) -> None:\n self._session_id: str | None = None\n self.prompts: list[str] = []\n self.started: asyncio.Queue[str] = asyncio.Queue()\n self.release: asyncio.Queue[None] = asyncio.Queue()\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del cancellation_policy\n self.prompts.append(prompt)\n self._session_id = \"interjection-session\"\n await self.started.put(prompt)\n await self.release.get()\n text = AgentEvent.create(\n len(self.prompts) * 2 - 1,\n AgentEventKind.TEXT_DELTA,\n {\"text\": f\"response to {prompt}\"},\n )\n completed = AgentEvent.create(\n len(self.prompts) * 2,\n AgentEventKind.TURN_COMPLETED,\n {\"step\": 1, \"duration_seconds\": 0.1},\n )\n if sink is not None:\n for event in (text, completed):\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\n self._session_id,\n f\"response to {prompt}\",\n (),\n (),\n (text, completed),\n 1,\n )\n\n\nclass StreamingTuiConversation:\n def __init__(self) -> None:\n self._session_id: str | None = None\n self.started = asyncio.Event()\n self.release = asyncio.Event()\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt, cancellation_policy\n self._session_id = \"streaming-session\"\n first = AgentEvent.create(1, AgentEventKind.TEXT_DELTA, {\"text\": \"partial\"})\n if sink is not None:\n outcome = sink(first)\n if inspect.isawaitable(outcome):\n await outcome\n self.started.set()\n await self.release.wait()\n second = AgentEvent.create(2, AgentEventKind.TEXT_DELTA, {\"text\": \" response\"})\n if sink is not None:\n outcome = sink(second)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\n self._session_id,\n \"partial response\",\n (),\n (),\n (first, second),\n 1,\n )\n\n\nclass FinalizingTuiConversation:\n def __init__(self, execution_status: str) -> None:\n self._execution_status = execution_status\n self._session_id: str | None = None\n self.started = asyncio.Event()\n self.release = asyncio.Event()\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt, cancellation_policy\n self._session_id = \"finalizing-session\"\n finalizing = AgentEvent.create(\n 1,\n AgentEventKind.FINALIZING_STARTED,\n {\n \"execution_status\": self._execution_status,\n \"execution_reason\": \"model_step_limit\",\n \"recoverable\": True,\n },\n )\n if sink is not None:\n outcome = sink(finalizing)\n if inspect.isawaitable(outcome):\n await outcome\n self.started.set()\n await self.release.wait()\n text = AgentEvent.create(2, AgentEventKind.TEXT_DELTA, {\"text\": \"safe final text\"})\n completed = AgentEvent.create(\n 3,\n AgentEventKind.TURN_COMPLETED,\n {\n \"step\": 1,\n \"duration_seconds\": 0.25,\n \"execution_status\": self._execution_status,\n \"recoverable\": True,\n },\n )\n if sink is not None:\n for event in (text, completed):\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\n self._session_id,\n \"safe final text\",\n (),\n (),\n (finalizing, text, completed),\n 1,\n )\n\n\nclass UnknownTerminalMetadataTuiConversation:\n @property\n def session_id(self) -> str | None:\n return \"unknown-terminal-session\"\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt, cancellation_policy\n events = (\n AgentEvent.create(1, AgentEventKind.TEXT_DELTA, {\"text\": \"ordinary text\"}),\n AgentEvent.create(\n 2,\n AgentEventKind.TURN_COMPLETED,\n {\n \"step\": 1,\n \"duration_seconds\": 0.25,\n \"execution_status\": \"unknown_terminal\",\n \"recoverable\": True,\n },\n ),\n )\n if sink is not None:\n for event in events:\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\"unknown-terminal-session\", \"ordinary text\", (), (), events, 1)\n\n\nclass UiPreferencesFixture:\n def __init__(self) -> None:\n self.saved: list[UiLanguage] = []\n self.saved_efforts: list[ReasoningEffort] = []\n self.saved_modes: list[InteractionMode] = []\n\n async def load_language(self) -> UiLanguage:\n return UiLanguage.ENGLISH\n\n async def save_language(self, language: UiLanguage) -> None:\n self.saved.append(language)\n\n async def load_reasoning_effort(self) -> ReasoningEffort:\n return ReasoningEffort.HIGH\n\n async def save_reasoning_effort(self, effort: ReasoningEffort) -> None:\n self.saved_efforts.append(effort)\n\n async def load_interaction_mode(self) -> InteractionMode:\n return InteractionMode.NORMAL\n\n async def save_interaction_mode(self, mode: InteractionMode) -> None:\n self.saved_modes.append(mode)\n\n\nclass ProviderCatalogFixture:\n def __init__(\n self,\n result: ProviderCatalogResult | None = None,\n error: ProviderCatalogError | None = None,\n ) -> None:\n self.result = result or ProviderCatalogResult(())\n self.error = error\n self.calls: list[tuple[ProviderConnectionSpec, HttpClientPolicy]] = []\n\n async def discover_models(\n self,\n spec: ProviderConnectionSpec,\n *,\n http_policy: HttpClientPolicy,\n ) -> ProviderCatalogResult:\n self.calls.append((spec, http_policy))\n if self.error is not None:\n raise self.error\n return self.result\n\n\nclass BlockingProviderCatalogFixture(ProviderCatalogFixture):\n def __init__(self, result: ProviderCatalogResult) -> None:\n super().__init__(result)\n self.started = asyncio.Event()\n self.release = asyncio.Event()\n\n async def discover_models(\n self,\n spec: ProviderConnectionSpec,\n *,\n http_policy: HttpClientPolicy,\n ) -> ProviderCatalogResult:\n self.calls.append((spec, http_policy))\n self.started.set()\n await self.release.wait()\n return self.result\n\n\nclass ApprovalControllerFixture:\n def __init__(self) -> None:\n self.handlers: list[object | None] = []\n\n def set_handler(self, handler: object | None) -> None:\n self.handlers.append(handler)\n\n\nclass ProfileTuiController:\n def __init__(\n self,\n plan: SessionPlan | None = None,\n *,\n plan_comments: tuple[PlanComment, ...] = (),\n session_tasks: tuple[SessionTask, ...] = (),\n ) -> None:\n self._selected_profile = \"first\"\n self.selections: list[str] = []\n self.effort_selections: list[ReasoningEffort] = []\n self.mode_selections: list[InteractionMode] = []\n self.plan_execution_calls = 0\n self._reasoning_effort = ReasoningEffort.HIGH\n self._interaction_mode = InteractionMode.NORMAL\n self._plan = plan\n self._plan_comments = plan_comments\n self._session_tasks = session_tasks\n self._options = (\n ProviderOption(\n \"first\",\n \"openai-chat\",\n \"first-model\",\n True,\n True,\n default=True,\n context_window_tokens=1_000_000,\n ),\n ProviderOption(\n \"second\",\n \"anthropic-messages\",\n \"second-model\",\n True,\n True,\n context_window_tokens=200_000,\n ),\n ProviderOption(\"missing\", \"openai-chat\", \"missing-model\", True, False),\n )\n\n @property\n def profiles(self) -> tuple[ProviderOption, ...]:\n return tuple(\n replace(option, selected=option.name == self._selected_profile)\n for option in self._options\n )\n\n @property\n def selected_profile(self) -> str:\n return self._selected_profile\n\n @property\n def reasoning_effort(self) -> ReasoningEffort:\n return self._reasoning_effort\n\n @property\n def effective_reasoning_effort(self) -> ReasoningEffort:\n return self._reasoning_effort.effective\n\n @property\n def interaction_mode(self) -> InteractionMode:\n return self._interaction_mode\n\n @property\n def auto_mode_unrestricted(self) -> bool:\n return False\n\n @property\n def plan(self) -> SessionPlan | None:\n return self._plan\n\n async def add_plan_comment(self, step_index: int, content: str) -> PlanComment:\n if self._plan is None:\n raise ValueError(\"cannot comment on a plan that has not been saved\")\n comment = PlanComment(\n f\"plan-comment-{len(self._plan_comments) + 1}\",\n step_index,\n content,\n datetime.now(UTC),\n )\n self._plan_comments = (*self._plan_comments, comment)\n return comment\n\n async def list_plan_comments(self) -> tuple[PlanComment, ...]:\n return self._plan_comments\n\n async def set_reasoning_effort(\n self,\n effort: ReasoningEffort,\n ) -> ReasoningEffortSelectionResult:\n changed = effort is not self._reasoning_effort\n self.effort_selections.append(effort)\n self._reasoning_effort = effort\n return ReasoningEffortSelectionResult(\n requested=effort,\n effective=effort.effective,\n changed=changed,\n )\n\n async def set_interaction_mode(\n self,\n mode: InteractionMode,\n ) -> InteractionModeSelectionResult:\n changed = mode is not self._interaction_mode\n self.mode_selections.append(mode)\n self._interaction_mode = mode\n return InteractionModeSelectionResult(\n requested=mode,\n changed=changed,\n auto_unrestricted=False,\n )\n\n async def schedule_plan(self) -> SessionTask:\n if self._plan is None:\n raise ValueError(\"cannot schedule a plan that has not been saved\")\n task = SessionTask(\n f\"task-queued-{len(self._session_tasks) + 1}\",\n SessionTaskKind.PLAN_EXECUTION,\n SessionTaskStatus.QUEUED,\n datetime.now(UTC),\n plan_snapshot=self._plan,\n )\n self._session_tasks = (*self._session_tasks, task)\n return task\n\n async def execute_plan(\n self,\n *,\n sink: EventSink | None = None,\n task_id: str | None = None,\n ) -> AgentRunResult:\n if self._plan is None:\n raise ValueError(\"cannot execute a plan that has not been saved\")\n del task_id\n self.plan_execution_calls += 1\n events = (\n AgentEvent.create(\n 1,\n AgentEventKind.PLAN_EXECUTION_REQUESTED,\n {\"plan\": self._plan.to_dict()},\n ),\n AgentEvent.create(\n 2,\n AgentEventKind.TURN_COMPLETED,\n {\"step\": 1, \"duration_seconds\": 0.25},\n ),\n )\n if sink is not None:\n for event in events:\n outcome = sink(event)\n if inspect.isawaitable(outcome):\n await outcome\n return AgentRunResult(\n \"plan-session\",\n \"plan execution response\",\n (),\n (),\n events,\n 1,\n self._plan,\n )\n\n async def run_session_task(\n self,\n task_id: str,\n *,\n sink: EventSink | None = None,\n ) -> AgentRunResult:\n task = await self.get_session_task(task_id)\n if task is None or task.status is not SessionTaskStatus.QUEUED:\n raise ValueError(\"queued task is unavailable\")\n started_at = datetime.now(UTC)\n running = task.start(started_at=started_at)\n self._session_tasks = tuple(\n running if item.task_id == task_id else item for item in self._session_tasks\n )\n result = await self.execute_plan(sink=sink, task_id=task_id)\n finished_at = datetime.now(UTC)\n completed = running.finish(SessionTaskStatus.COMPLETED, finished_at=finished_at)\n self._session_tasks = tuple(\n completed if item.task_id == task_id else item for item in self._session_tasks\n )\n return result\n\n async def list_session_tasks(self) -> tuple[SessionTask, ...]:\n return self._session_tasks\n\n async def get_session_task(self, task_id: str) -> SessionTask | None:\n return next((task for task in self._session_tasks if task.task_id == task_id), None)\n\n async def select_profile(self, name: str) -> ProviderSelectionResult:\n self.selections.append(name)\n changed = name != self._selected_profile\n self._selected_profile = name\n model = next(option.model for option in self._options if option.name == name)\n context_window_tokens = next(\n option.context_window_tokens for option in self._options if option.name == name\n )\n return ProviderSelectionResult(\n name,\n name,\n model,\n \"old-session\" if changed else None,\n changed,\n context_window_tokens=context_window_tokens,\n )\n\n\nclass FailingSessionTaskController:\n async def get_session_task(self, task_id: str) -> SessionTask | None:\n del task_id\n raise RuntimeError(\"task read failed\")\n\n\ndef restored_history() -> tuple[SessionItem, ...]:\n return (\n Message(\n Role.USER,\n content_parts=(\n ContentPart.from_text(\"restored prompt\"),\n ContentPart.from_image(\"data:image/png;base64,private-image\"),\n ),\n ),\n PreservedContextItem(\n ContextItemKind.REASONING,\n {\n \"type\": \"reasoning\",\n \"id\": \"private-reasoning\",\n \"summary\": [{\"type\": \"summary_text\", \"text\": \"never render this\"}],\n },\n ),\n Message(\n Role.ASSISTANT,\n tool_calls=(ToolCall(\"read-1\", \"read_file\", {\"path\": \"private.txt\"}),),\n reasoning_content=\"private assistant reasoning\",\n ),\n Message(\n Role.TOOL,\n \"private tool output\",\n name=\"read_file\",\n tool_call_id=\"read-1\",\n ),\n Message(Role.ASSISTANT, \"restored response\"),\n )\n\n\nclass SessionTuiController:\n def __init__(self, *, current_session: str = \"current-session\") -> None:\n self._session_id = current_session\n self.selected: list[str] = []\n self.renamed: list[str] = []\n self.queries: list[str | None] = []\n timestamp = datetime(2026, 7, 18, 9, 30, tzinfo=UTC)\n self.options = (\n SessionOption(\n \"current-session\",\n \"first\",\n \"first-model\",\n timestamp,\n \"first\",\n current_session == \"current-session\",\n True,\n True,\n title=\"Current workspace session\",\n ),\n SessionOption(\n \"target-session-123456789\",\n \"second\",\n \"second-model\",\n timestamp,\n \"second\",\n current_session == \"target-session-123456789\",\n True,\n True,\n title=\"Escaped quoted session\",\n matched_fields=(\"title\", \"content\"),\n snippet=\"[quoted] content from the restored conversation\",\n ),\n )\n\n @property\n def session_id(self) -> str | None:\n return self._session_id\n\n async def run(\n self,\n prompt: str,\n *,\n sink: EventSink | None = None,\n cancellation_policy: TurnCancellationPolicy = TurnCancellationPolicy.RETAIN,\n ) -> AgentRunResult:\n del prompt, sink, cancellation_policy\n return AgentRunResult(self._session_id, \"ok\", (), (), (), 1)\n\n async def list_sessions(self, query: str | None = None) -> tuple[SessionOption, ...]:\n self.queries.append(query)\n if query is not None:\n return tuple(\n option\n for option in self.options\n if query.casefold() in f\"{option.title or ''} {option.snippet or ''}\".casefold()\n )\n return self.options\n\n async def select_session(self, session_id: str) -> SessionSelectionResult:\n self.selected.append(session_id)\n previous = self._session_id\n changed = session_id != previous\n self._session_id = session_id\n return SessionSelectionResult(\n session_id,\n \"second\",\n \"second-model\",\n \"second\",\n \"second\",\n \"second-model\",\n previous if changed else None,\n changed,\n True,\n restored_history(),\n )\n\n async def rename_session(self, title: str) -> SessionSummary:\n self.renamed.append(title)\n timestamp = datetime(2026, 7, 18, 9, 30, tzinfo=UTC)\n return SessionSummary(\n self._session_id,\n \"/workspace\",\n \"first\",\n \"first-model\",\n timestamp,\n timestamp,\n title=title,\n )\n\n\nclass TaskTuiController:\n def __init__(self, snapshots: tuple[BackgroundTaskSnapshot, ...] = ()) -> None:\n self.snapshots = snapshots\n self.list_calls = 0\n self.wake_state = BackgroundWakeState()\n\n async def list_background_tasks(self) -> tuple[BackgroundTaskSnapshot, ...]:\n self.list_calls += 1\n return self.snapshots\n\n async def load_background_wake_state(self) -> BackgroundWakeState:\n return self.wake_state\n\n async def save_background_wake_state(self, state: BackgroundWakeState) -> None:\n self.wake_state = state\n\n\nclass FailingTaskTuiController:\n async def list_background_tasks(self) -> tuple[BackgroundTaskSnapshot, ...]:\n raise RuntimeError(\"task list failed\")\n\n async def load_background_wake_state(self) -> BackgroundWakeState:\n raise RuntimeError(\"wake state failed\")\n\n async def save_background_wake_state(self, state: BackgroundWakeState) -> None:\n del state\n\n\ndef background_snapshot(\n task_id: str,\n status: BackgroundTaskStatus,\n *,\n exit_code: int | None = None,\n completion_reported: bool = False,\n) -> BackgroundTaskSnapshot:\n started_at = datetime(2026, 7, 18, 9, 30, tzinfo=UTC)\n return BackgroundTaskSnapshot(\n task_id=task_id,\n command=\"curl -H 'secret: private-command' https://example.invalid\",\n cwd=\"/workspace\",\n status=status,\n output=\"private task output\",\n total_output_bytes=19,\n truncated=False,\n exit_code=exit_code,\n started_at=started_at,\n finished_at=started_at if status.terminal else None,\n completion_reported=completion_reported,\n )\n\n\nclass NeuroCodeAppTests(unittest.IsolatedAsyncioTestCase):\n async def test_plan_queue_commands_report_unavailable_and_failed_paths(self) -> None:\n \"\"\"The explicit queue surface fails closed when its collaborators are absent.\"\"\"\n\n unavailable = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with unavailable.run_test(size=(80, 24)):\n await unavailable._schedule_plan()\n await unavailable._run_queued_task(\"missing\")\n self.assertIn(\"unavailable\", unavailable.entries[-1].text.lower())\n\n no_plan = ProfileTuiController()\n no_plan_app = NeuroCodeApp(\n TuiConversation(),\n plan_controller=no_plan,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with no_plan_app.run_test(size=(80, 24)):\n await no_plan_app._schedule_plan()\n self.assertIn(\"No structured plan\", no_plan_app.entries[-1].text)\n\n class FailingScheduler(ProfileTuiController):\n async def schedule_plan(self) -> SessionTask:\n raise RuntimeError(\"schedule failed\")\n\n failing = FailingScheduler(SessionPlan((PlanStep(\"queued\"),)))\n failing_app = NeuroCodeApp(\n TuiConversation(),\n plan_controller=failing,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with failing_app.run_test(size=(80, 24)):\n await failing_app._schedule_plan()\n self.assertIn(\"RuntimeError: schedule failed\", failing_app.entries[-1].text)\n\n no_task_controller = ProfileTuiController(SessionPlan((PlanStep(\"queued\"),)))\n no_task_app = NeuroCodeApp(\n TuiConversation(),\n plan_controller=no_task_controller,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with no_task_app.run_test(size=(80, 24)):\n await no_task_app._run_queued_task(\"missing\")\n self.assertIn(\"unavailable\", no_task_app.entries[-1].text.lower())\n\n failing_task_app = NeuroCodeApp(\n TuiConversation(),\n plan_controller=ProfileTuiController(SessionPlan((PlanStep(\"queued\"),))),\n session_task_controller=FailingSessionTaskController(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with failing_task_app.run_test(size=(80, 24)):\n await failing_task_app._run_queued_task(\"task-failing\")\n self.assertIn(\"RuntimeError: task read failed\", failing_task_app.entries[-1].text)\n\n queued_controller = ProfileTuiController(SessionPlan((PlanStep(\"queued\"),)))\n queued = await queued_controller.schedule_plan()\n no_mode_app = NeuroCodeApp(\n TuiConversation(),\n plan_controller=queued_controller,\n session_task_controller=queued_controller,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with no_mode_app.run_test(size=(80, 24)):\n await no_mode_app._run_queued_task(queued.task_id)\n self.assertIn(\"unavailable\", no_mode_app.entries[-1].text.lower())\n\n async def test_local_quit_skips_the_model_and_detaches_approval_handler(self) -> None:\n runner = TuiConversation()\n approvals = ApprovalControllerFixture()\n app = NeuroCodeApp(\n runner,\n approval_controller=approvals,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(80, 24)) as pilot:\n self.assertTrue(approvals.handlers)\n self.assertIsNotNone(approvals.handlers[-1])\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/quit\"\n await pilot.press(\"enter\")\n\n self.assertEqual(runner.prompts, [])\n self.assertEqual(app.return_code, 0)\n self.assertIsNone(approvals.handlers[-1])\n\n async def test_monochrome_theme_uses_the_compact_custom_chrome(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(80, 24)) as pilot:\n await pilot.pause()\n\n self.assertEqual(app.theme, \"neuro-code-mono\")\n self.assertEqual(app.screen.styles.background.hex.lower(), \"#0c0c0c\")\n self.assertEqual(BORDER_FOCUS, \"#BDBDBD\")\n self.assertNotIn(\"#F0F0F0\", NeuroCodeApp.CSS)\n self.assertFalse(app.ENABLE_COMMAND_PALETTE)\n self.assertIn(\"NEURO / CODE\", str(app.query_one(\"#brand\", Static).renderable))\n self.assertEqual(str(app.query_one(\"#clock\", Static).renderable).count(\":\"), 1)\n self.assertEqual(len(list(app.query(\"#header\"))), 1)\n self.assertEqual(len(list(app.query(\"#prompt-row\"))), 1)\n self.assertEqual(len(list(app.query(\"#prompt-mark\"))), 1)\n self.assertEqual(\n app.query_one(\"#prompt-mark\", Static).renderable,\n \"\\N{SINGLE RIGHT-POINTING ANGLE QUOTATION MARK}\",\n )\n for color in MONO_COLORS:\n red, green, blue = (int(color[index : index + 2], 16) for index in (1, 3, 5))\n self.assertEqual((red, green, blue), (red, red, red))\n entry_styles = {\n str(app._render_entry(category, \"content\").style)\n for category in (\"assistant\", \"system\", \"tool\", \"user\")\n }\n self.assertFalse(\n any(\n color in style\n for style in entry_styles\n for color in (\"cyan\", \"green\", \"magenta\", \"yellow\")\n )\n )\n self.assertFalse(\n any(\n accent in NeuroCodeApp.CSS\n for accent in (\n ACCENT_CODE,\n ACCENT_LINK,\n ACCENT_NUMBER,\n ACCENT_SUCCESS,\n ACCENT_WARNING,\n ACCENT_ERROR,\n )\n )\n )\n\n async def test_user_and_assistant_messages_use_distinct_unlabelled_blocks(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"inspect the repository\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if any(entry.category == \"assistant\" for entry in app.entries):\n break\n\n messages = list(app.query(ConversationMessage))\n user = next(message for message in messages if message.category == \"user\")\n assistant = next(message for message in messages if message.category == \"assistant\")\n user_text = str(user.renderable)\n assistant_text = str(assistant.renderable)\n self.assertTrue(user.has_class(\"message-user\"))\n self.assertTrue(assistant.has_class(\"message-assistant\"))\n self.assertTrue(user_text.startswith(\"inspect the repository\"))\n self.assertIn(\"fixture response\", assistant_text)\n self.assertNotIn(\"You:\", user_text)\n self.assertNotIn(\"Assistant:\", assistant_text)\n\n async def test_assistant_markdown_uses_semantic_styles_without_markup_injection(\n self,\n ) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)):\n rendered = app._render_entry(\n \"assistant\",\n \"## Important\\n\\nUse **bold** and `code`.\\n\\n- [red]literal[/red]\",\n )\n self.assertIsInstance(rendered, AssistantMarkdown)\n segments = list(app.console.render(rendered, app.console.options.update(width=80)))\n plain = \"\".join(segment.text for segment in segments)\n styled = {\n segment.text.strip(): str(segment.style)\n for segment in segments\n if segment.text.strip()\n }\n\n self.assertIn(\"Important\", plain)\n self.assertIn(\"bold\", plain)\n self.assertIn(\"code\", plain)\n self.assertIn(\"[red]literal[/red]\", plain)\n self.assertNotIn(\"**bold**\", plain)\n self.assertIn(TEXT_EMPHASIS.lower(), styled[\"Important\"].lower())\n self.assertIn(TEXT_PRIMARY.lower(), styled[\"bold\"].lower())\n self.assertIn(ACCENT_CODE.lower(), styled[\"code\"].lower())\n\n async def test_fenced_code_blocks_keep_the_custom_semantic_syntax_theme(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)):\n rendered = app._render_entry(\n \"assistant\",\n '```python\\nclass Sample:\\n return \"ok\", 42\\n```',\n )\n self.assertIsInstance(rendered, AssistantMarkdown)\n self.assertIs(rendered.code_theme, MONO_SYNTAX_THEME)\n plain = \"\".join(\n segment.text\n for segment in app.console.render(rendered, app.console.options.update(width=80))\n )\n self.assertIn(\"Sample\", plain)\n self.assertIn(\n ACCENT_LINK.lower(),\n str(MONO_SYNTAX_THEME.get_style_for_token(Keyword)).lower(),\n )\n self.assertIn(\n ACCENT_CODE.lower(),\n str(MONO_SYNTAX_THEME.get_style_for_token(Name.Function)).lower(),\n )\n self.assertIn(\n ACCENT_SUCCESS.lower(),\n str(MONO_SYNTAX_THEME.get_style_for_token(String)).lower(),\n )\n self.assertIn(\n TEXT_EMPHASIS.lower(),\n str(MONO_SYNTAX_THEME.get_style_for_token(Number)).lower(),\n )\n\n async def test_markdown_prose_remains_neutral_gray(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)):\n rendered = app._render_entry(\"assistant\", \"Ordinary prose stays neutral.\")\n segments = list(app.console.render(rendered, app.console.options.update(width=80)))\n prose = next(segment for segment in segments if \"Ordinary prose\" in segment.text)\n self.assertIn(TEXT_BODY.lower(), str(prose.style).lower())\n self.assertNotIn(ACCENT_CODE.lower(), str(prose.style).lower())\n\n async def test_success_warning_and_error_statuses_use_distinct_semantic_accents(self) -> None:\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=JsonProviderSettingsStore(Path(directory)),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n status = screen.query_one(\"#provider-settings-connection-status\", Static)\n for kind, marker, accent in (\n (\"success\", \"✓\", ACCENT_SUCCESS),\n (\"warning\", \"!\", ACCENT_WARNING),\n (\"error\", \"\\N{MULTIPLICATION SIGN}\", ACCENT_ERROR),\n ):\n screen._show_connection_status(\"fixture status\", kind=kind)\n rendered = status.renderable\n self.assertIn(marker, str(rendered))\n self.assertIn(accent.lower(), str(rendered.style).lower())\n\n async def test_tool_notice_highlights_the_tool_name_in_an_aligned_gutter(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(80, 24)):\n rendered = app._render_entry(\n \"tool\",\n \"Tool read_file completed.\",\n ui_key=\"tool.completed\",\n ui_values=((\"name\", \"read_file\"),),\n )\n segments = list(app.console.render(rendered, app.console.options.update(width=60)))\n tool_segments = [segment for segment in segments if \"read_file\" in segment.text]\n\n self.assertTrue(tool_segments)\n self.assertIn(ACCENT_CODE.lower(), str(tool_segments[0].style).lower())\n\n async def test_streaming_response_updates_one_stable_transcript_node(self) -> None:\n runner = StreamingTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"stream the answer\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n await pilot.pause()\n\n transcript = app.query_one(\"#transcript\", VerticalScroll)\n pending = app._pending_assistant\n assert pending is not None\n child_count = len(transcript.children)\n self.assertIs(transcript.children[-1], pending)\n self.assertEqual(prompt.value, \"\")\n self.assertIn(\"partial\", str(pending.renderable))\n self.assertEqual(list(app.query(\"#stream\")), [])\n\n runner.release.set()\n for _ in range(20):\n await pilot.pause(0.01)\n if any(entry.category == \"assistant\" for entry in app.entries):\n break\n\n self.assertEqual(len(transcript.children), child_count)\n self.assertIs(app._entry_widgets[-1], pending)\n self.assertIs(pending.parent, transcript)\n self.assertIn(\"partial response\", str(pending.renderable))\n\n async def test_finalizing_and_recoverable_terminal_states_preserve_the_final_response(\n self,\n ) -> None:\n messages = {\n \"stuck\": \"The task entered a repeated loop and was stopped safely.\",\n \"budget_limited\": \"This turn reached its execution budget and was stopped safely.\",\n }\n for execution_status, expected in messages.items():\n with self.subTest(execution_status=execution_status):\n runner = FinalizingTuiConversation(execution_status)\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"finish safely\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n await pilot.pause()\n\n pending = app._pending_assistant\n assert pending is not None\n self.assertIn(\"Safely finalizing\", str(pending.renderable))\n self.assertTrue(pending.has_class(\"message-pending\"))\n\n runner.release.set()\n for _ in range(20):\n await pilot.pause(0.01)\n if any(entry.category == \"recoverable\" for entry in app.entries):\n break\n\n self.assertIn(\n \"safe final text\",\n [entry.text for entry in app.entries if entry.category == \"assistant\"],\n )\n recoverable = app.entries[-1]\n self.assertEqual(recoverable.category, \"recoverable\")\n self.assertIn(expected, recoverable.text)\n self.assertFalse(any(entry.category == \"error\" for entry in app.entries))\n widget = app._entry_widgets[-1]\n self.assertTrue(widget.has_class(\"message-recoverable\"))\n self.assertFalse(prompt.disabled)\n prompt.value = \"continue with new instructions\"\n self.assertEqual(prompt.value, \"continue with new instructions\")\n\n async def test_unknown_terminal_metadata_falls_back_to_normal_completion(self) -> None:\n app = NeuroCodeApp(\n UnknownTerminalMetadataTuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"complete normally\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if any(entry.ui_key == \"turn.completed\" for entry in app.entries):\n break\n\n self.assertIn(\"ordinary text\", [entry.text for entry in app.entries])\n self.assertTrue(any(entry.ui_key == \"turn.completed\" for entry in app.entries))\n self.assertFalse(any(entry.category == \"recoverable\" for entry in app.entries))\n self.assertFalse(any(entry.category == \"error\" for entry in app.entries))\n self.assertFalse(prompt.disabled)\n\n async def test_resumed_recoverable_execution_record_shows_one_safe_notice(self) -> None:\n for status, reason_code, key in (\n (\n AgentExecutionStatus.STUCK,\n SupervisorReasonCode.REPEATED_ACTION_OBSERVATION,\n \"session.stuck_recoverable\",\n ),\n (\n AgentExecutionStatus.BUDGET_LIMITED,\n SupervisorReasonCode.MODEL_STEP_LIMIT,\n \"session.budget_limited_recoverable\",\n ),\n ):\n with self.subTest(status=status):\n runner = TuiConversation()\n runner._session_id = \"session-resumed\"\n record = SessionExecutionRecord(\n outcome=AgentExecutionOutcome(\n status=status,\n reason_code=reason_code,\n finalized=True,\n recoverable=True,\n ),\n event_sequence=4,\n completed_at=datetime.now(UTC),\n )\n app = NeuroCodeApp(\n runner,\n execution_record=record,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)):\n notices = [entry for entry in app.entries if entry.ui_key == key]\n self.assertEqual(len(notices), 1)\n self.assertEqual(notices[0].category, \"recoverable\")\n self.assertFalse(any(entry.category == \"error\" for entry in app.entries))\n\n async def test_resumed_completed_execution_record_has_no_recoverable_notice(self) -> None:\n runner = TuiConversation()\n runner._session_id = \"session-resumed\"\n record = SessionExecutionRecord(\n outcome=AgentExecutionOutcome(\n status=AgentExecutionStatus.COMPLETED,\n reason_code=None,\n finalized=False,\n recoverable=False,\n ),\n event_sequence=4,\n completed_at=datetime.now(UTC),\n )\n app = NeuroCodeApp(\n runner,\n execution_record=record,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)):\n self.assertFalse(\n any(\n entry.ui_key\n in {\n \"session.stuck_recoverable\",\n \"session.budget_limited_recoverable\",\n }\n for entry in app.entries\n )\n )\n\n async def test_waiting_model_uses_the_supplied_collapsing_pulse(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)):\n app._begin_pending_assistant()\n pending = app._pending_assistant\n assert pending is not None\n first_frame = str(pending.renderable)\n self.assertIn(\"█\", first_frame)\n self.assertIn(\"Thinking\", first_frame)\n self.assertIn(\"↓≈0 tok\", first_frame)\n loading_segments = list(\n app.console.render(pending.renderable, app.console.options.update(width=80))\n )\n self.assertIn(\n TEXT_SECONDARY.lower(),\n str(\n next(\n segment.style for segment in loading_segments if \"Thinking\" in segment.text\n )\n ).lower(),\n )\n self.assertIn(\n TEXT_SECONDARY.lower(),\n str(\n next(segment.style for segment in loading_segments if \"≈0 tok\" in segment.text)\n ).lower(),\n )\n\n app._advance_model_loading_animation()\n app._advance_model_loading_animation()\n\n second_frame = str(pending.renderable)\n self.assertNotEqual(first_frame, second_frame)\n self.assertNotIn(\"█\", str(app.query_one(\"#runtime-model\", Static).renderable))\n await app._discard_pending_assistant()\n self.assertFalse(app._model_loading)\n\n async def test_settings_switches_and_persists_the_interface_language(self) -> None:\n preferences = UiPreferencesFixture()\n app = NeuroCodeApp(\n TuiConversation(),\n ui_preferences=preferences,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n app._write_entry(\"assistant\", \"literal model response\")\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/setting\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, SettingsScreen):\n break\n\n self.assertIsInstance(app.screen, SettingsScreen)\n self.assertEqual(list(app.screen.query(\"#provider-settings-form\")), [])\n self.assertEqual(list(app.screen.query(\"#settings-languages\")), [])\n clicked = await pilot.click(\"#settings-category-language\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, LanguageSettingsScreen):\n break\n\n self.assertIsInstance(app.screen, LanguageSettingsScreen)\n clicked = await pilot.click(\"#settings-language-zh-cn\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if preferences.saved:\n break\n\n self.assertEqual(preferences.saved, [UiLanguage.SIMPLIFIED_CHINESE])\n self.assertEqual(app.sub_title, \"终端编程智能体\")\n self.assertIn(\"输入 /help\", prompt.placeholder)\n self.assertIn(\"设置\", str(app.query_one(\"#shortcut-bar\", Static).renderable))\n self.assertTrue(app.entries[0].text.startswith(\"已就绪\"))\n self.assertIn(\n \"literal model response\",\n [entry.text for entry in app.entries if entry.category == \"assistant\"],\n )\n self.assertIn(\"界面语言已切换\", app.entries[-1].text)\n\n prompt.value = \"/status\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"供应商\", app.entries[-1].text)\n self.assertIn(\"fixture/fixture-model\", app.entries[-1].text)\n\n async def test_first_run_settings_save_a_provider_without_echoing_its_key(self) -> None:\n self.assertEqual(\n ProviderSettingsScreen._preset_for_profile(\n ManagedProviderProfile(\n name=\"legacy-wrong-protocol\",\n protocol=\"openai-responses\",\n model=\"deepseek-v4-pro\",\n base_url=\"https://api.deepseek.com/v1\",\n )\n ),\n \"openai\",\n )\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=store,\n )\n\n async with app.run_test(size=(110, 40)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n self.assertIsInstance(app.screen, ProviderSettingsScreen)\n clicked = await pilot.click(\"#provider-settings-preset-deepseek\")\n self.assertTrue(clicked)\n self.assertEqual(\n app.screen.query_one(\"#provider-settings-base-url\", Input).value,\n \"https://api.deepseek.com\",\n )\n self.assertIn(\n \"/chat/completions\",\n str(\n app.screen.query_one(\n \"#provider-settings-protocol-hint\",\n Static,\n ).renderable\n ),\n )\n app.screen.query_one(\"#provider-settings-name\", Input).value = \"personal\"\n app.screen.query_one(\"#provider-settings-model\", Input).value = \"deepseek-v4-pro\"\n api_key = app.screen.query_one(\"#provider-settings-api-key\", Input)\n api_key.value = \"never-echo-this-key\"\n self.assertTrue(api_key.password)\n\n clicked = await pilot.click(\"#provider-settings-save\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if (await store.load()).profiles:\n break\n\n saved = await store.load()\n self.assertEqual(saved.default_provider, \"personal\")\n self.assertEqual(saved.profiles[0].protocol, \"openai-chat\")\n self.assertEqual(saved.profiles[0].model, \"deepseek-v4-pro\")\n self.assertNotIn(\"never-echo-this-key\", repr(saved))\n\n async def test_deepseek_responses_profile_is_allowed(self) -> None:\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=store,\n )\n\n async with app.run_test(size=(110, 40)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n self.assertIsInstance(app.screen, ProviderSettingsScreen)\n screen = app.screen\n screen._select_preset(\"openai\")\n screen.query_one(\"#provider-settings-name\", Input).value = \"deepseek-responses\"\n screen.query_one(\"#provider-settings-model\", Input).value = \"deepseek-v4-flash\"\n screen.query_one(\n \"#provider-settings-base-url\", Input\n ).value = \"https://api.deepseek.com\"\n screen.query_one(\"#provider-settings-api-key\", Input).value = \"never-echo-this-key\"\n\n await pilot.click(\"#provider-settings-save\")\n for _ in range(20):\n await pilot.pause(0.01)\n if (await store.load()).profiles:\n break\n\n saved = await store.load()\n self.assertEqual(saved.default_provider, \"deepseek-responses\")\n self.assertEqual(saved.profiles[0].protocol, \"openai-responses\")\n self.assertEqual(saved.profiles[0].base_url, \"https://api.deepseek.com\")\n self.assertNotIn(\"never-echo-this-key\", repr(saved))\n\n async def test_invalid_environment_proxy_stays_in_settings_and_direct_mode_recovers(\n self,\n ) -> None:\n with (\n tempfile.TemporaryDirectory() as directory,\n patch.dict(\n \"os.environ\",\n {\"ALL_PROXY\": \"socks://127.0.0.1:7890\"},\n clear=True,\n ),\n ):\n store = JsonProviderSettingsStore(Path(directory))\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=store,\n )\n\n async with app.run_test(size=(110, 44)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n await pilot.click(\"#provider-settings-preset-deepseek\")\n screen.query_one(\"#provider-settings-name\", Input).value = \"deepseek\"\n screen.query_one(\"#provider-settings-model\", Input).value = \"deepseek-v4-flash\"\n screen.query_one(\"#provider-settings-api-key\", Input).value = \"secret\"\n\n await pilot.click(\"#provider-settings-save\")\n await pilot.pause()\n\n self.assertIs(app.screen, screen)\n self.assertEqual((await store.load()).profiles, ())\n self.assertIn(\n \"ALL_PROXY\",\n str(screen.query_one(\"#provider-settings-error\", Static).renderable),\n )\n\n app.screen._select_proxy_mode(\"direct\")\n await app.screen._save_provider()\n for _ in range(20):\n await pilot.pause(0.01)\n if (await store.load()).profiles:\n break\n\n saved = await store.load()\n self.assertEqual(saved.default_provider, \"deepseek\")\n self.assertEqual(saved.profiles[0].proxy_mode, \"direct\")\n self.assertIsNone(saved.profiles[0].proxy_url_env)\n\n async def test_provider_connection_loads_models_and_selects_without_saving_secret(\n self,\n ) -> None:\n catalog = ProviderCatalogFixture(\n ProviderCatalogResult((\"deepseek-chat\", \"deepseek-reasoner\"))\n )\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=store,\n provider_catalog=catalog,\n )\n\n async with app.run_test(size=(110, 48)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n screen._select_preset(\"deepseek\")\n screen._select_proxy_mode(\"direct\")\n screen.query_one(\"#provider-settings-name\", Input).value = \"deepseek\"\n screen.query_one(\"#provider-settings-api-key\", Input).value = \"never-render-key\"\n\n clicked = await pilot.click(\"#provider-settings-test\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if (\n catalog.calls\n and not screen.query_one(\"#provider-settings-test\", Button).disabled\n ):\n break\n\n self.assertEqual(len(catalog.calls), 1)\n spec, policy = catalog.calls[0]\n self.assertEqual(spec.protocol, \"openai-chat\")\n self.assertEqual(spec.base_url, \"https://api.deepseek.com\")\n self.assertFalse(policy.trust_env)\n self.assertNotIn(\"never-render-key\", repr(spec))\n status = str(\n screen.query_one(\"#provider-settings-connection-status\", Static).renderable\n )\n self.assertIn(\"Loaded 2 models\", status)\n self.assertNotIn(\"never-render-key\", status)\n self.assertTrue(screen.query_one(\"#provider-settings-models\").display)\n\n model_button = screen.query_one(\"#provider-settings-catalog-model-1\", Button)\n await screen.on_button_pressed(Button.Pressed(model_button))\n await pilot.pause()\n self.assertEqual(\n screen.query_one(\"#provider-settings-model\", Input).value,\n \"deepseek-reasoner\",\n )\n\n async def test_provider_connection_error_is_localized_redacted_and_keeps_screen_open(\n self,\n ) -> None:\n catalog = ProviderCatalogFixture(\n error=ProviderCatalogError(\"authentication\", status_code=401)\n )\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=store,\n provider_catalog=catalog,\n language=UiLanguage.SIMPLIFIED_CHINESE,\n )\n\n async with app.run_test(size=(110, 48)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n screen._select_preset(\"deepseek\")\n screen.query_one(\"#provider-settings-name\", Input).value = \"deepseek\"\n screen.query_one(\"#provider-settings-api-key\", Input).value = \"never-render-key\"\n\n await screen._test_connection()\n await pilot.pause()\n\n self.assertIs(app.screen, screen)\n self.assertEqual((await store.load()).profiles, ())\n status = str(\n screen.query_one(\"#provider-settings-connection-status\", Static).renderable\n )\n self.assertIn(\"认证失败\", status)\n self.assertIn(\"401\", status)\n self.assertNotIn(\"never-render-key\", status)\n self.assertFalse(screen.query_one(\"#provider-settings-test\", Button).disabled)\n\n async def test_provider_connection_reuses_saved_key_without_echoing_it(self) -> None:\n catalog = ProviderCatalogFixture(ProviderCatalogResult((\"updated-model\",)))\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n settings = await store.save_profile(\n ManagedProviderProfile(\n name=\"personal\",\n protocol=\"openai-responses\",\n model=\"old-model\",\n base_url=\"https://api.openai.com/v1\",\n proxy_mode=\"direct\",\n api_key=\"saved-secret\",\n )\n )\n app = ProviderSetupApp(\n provider_settings=settings,\n provider_settings_store=store,\n provider_catalog=catalog,\n first_run=False,\n initial_profile=\"personal\",\n )\n\n async with app.run_test(size=(110, 48)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n self.assertEqual(\n screen.query_one(\"#provider-settings-api-key\", Input).value,\n \"\",\n )\n\n await screen._test_connection()\n\n self.assertEqual(catalog.calls[0][0].api_key, \"saved-secret\")\n self.assertNotIn(\n \"saved-secret\",\n str(\n screen.query_one(\"#provider-settings-connection-status\", Static).renderable\n ),\n )\n\n async def test_provider_connection_discards_result_after_draft_changes(self) -> None:\n catalog = BlockingProviderCatalogFixture(ProviderCatalogResult((\"stale-model\",)))\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=JsonProviderSettingsStore(Path(directory)),\n provider_catalog=catalog,\n )\n\n async with app.run_test(size=(110, 48)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n screen._select_preset(\"deepseek\")\n screen.query_one(\"#provider-settings-name\", Input).value = \"deepseek\"\n screen.query_one(\"#provider-settings-api-key\", Input).value = \"secret\"\n\n await pilot.click(\"#provider-settings-test\")\n await catalog.started.wait()\n screen.query_one(\n \"#provider-settings-base-url\", Input\n ).value = \"https://changed.invalid/v1\"\n catalog.release.set()\n for _ in range(20):\n await pilot.pause(0.01)\n if not screen.query_one(\"#provider-settings-test\", Button).disabled:\n break\n\n status = str(\n screen.query_one(\"#provider-settings-connection-status\", Static).renderable\n )\n self.assertIn(\"Discarded the old result\", status)\n self.assertFalse(screen.query_one(\"#provider-settings-models\").display)\n\n async def test_startup_proxy_error_opens_the_saved_profile_for_repair(self) -> None:\n with tempfile.TemporaryDirectory() as directory:\n store = JsonProviderSettingsStore(Path(directory))\n settings = await store.save_profile(\n ManagedProviderProfile(\n name=\"deepseek\",\n protocol=\"openai-chat\",\n model=\"deepseek-v4-flash\",\n base_url=\"https://api.deepseek.com\",\n api_key=\"secret\",\n )\n )\n app = ProviderSetupApp(\n provider_settings=settings,\n provider_settings_store=store,\n first_run=False,\n initial_profile=\"deepseek\",\n initial_error=\"ALL_PROXY uses unsupported scheme 'socks'\",\n )\n\n async with app.run_test(size=(110, 44)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n self.assertTrue(screen.query_one(\"#provider-settings-name\", Input).disabled)\n self.assertEqual(\n screen.query_one(\"#provider-settings-name\", Input).value,\n \"deepseek\",\n )\n self.assertIn(\n \"ALL_PROXY\",\n str(screen.query_one(\"#provider-settings-error\", Static).renderable),\n )\n self.assertEqual(\n screen.query_one(\"#provider-settings-proxy-inherit\", Button).variant,\n \"primary\",\n )\n\n async def test_network_defaults_and_provider_context_capacity_are_persisted(\n self,\n ) -> None:\n with tempfile.TemporaryDirectory() as directory:\n store = JsonProviderSettingsStore(Path(directory))\n settings = await store.save_profile(\n ManagedProviderProfile(\n name=\"personal\",\n protocol=\"openai-chat\",\n model=\"old-model\",\n base_url=\"https://provider.invalid/v1\",\n api_key=\"saved-secret\",\n )\n )\n app = NeuroCodeApp(\n TuiConversation(),\n provider_settings_store=store,\n managed_provider_settings=settings,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 44)) as pilot:\n await app.action_open_settings()\n await pilot.pause()\n self.assertIsInstance(app.screen, SettingsScreen)\n self.assertTrue(await pilot.click(\"#settings-category-network\"))\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, NetworkProxySettingsScreen):\n break\n self.assertIsInstance(app.screen, NetworkProxySettingsScreen)\n self.assertTrue(await pilot.click(\"#network-settings-direct\"))\n self.assertTrue(await pilot.click(\"#network-settings-save\"))\n for _ in range(20):\n await pilot.pause(0.01)\n if app.return_code is not None:\n break\n\n updated = await store.load()\n self.assertEqual(updated.proxy_defaults, ManagedProxyPolicy(\"direct\"))\n self.assertIsNone(updated.profiles[0].proxy_mode)\n self.assertEqual(app.return_code, TUI_RELOAD_PROVIDER_SETTINGS)\n\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n app = ProviderSetupApp(\n provider_settings=ManagedProviderSettings(),\n provider_settings_store=store,\n )\n\n async with app.run_test(size=(110, 44)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n screen._select_preset(\"deepseek\")\n screen.query_one(\"#provider-settings-name\", Input).value = \"deepseek\"\n screen.query_one(\"#provider-settings-model\", Input).value = \"deepseek-v4-flash\"\n screen.query_one(\"#provider-settings-api-key\", Input).value = \"saved-secret\"\n screen.query_one(\"#provider-settings-context-window\", Input).value = \"128000\"\n await screen._save_provider()\n for _ in range(20):\n await pilot.pause(0.01)\n if (await store.load()).profiles:\n break\n\n saved = await store.load()\n self.assertEqual(saved.profiles[0].context_window_tokens, 128_000)\n self.assertIsNone(saved.profiles[0].proxy_mode)\n\n async def test_background_wake_global_default_and_provider_override_are_persisted(self) -> None:\n with tempfile.TemporaryDirectory() as directory, patch.dict(\"os.environ\", {}, clear=True):\n store = JsonProviderSettingsStore(Path(directory))\n settings = await store.save_profile(\n ManagedProviderProfile(\n name=\"personal\",\n protocol=\"openai-chat\",\n model=\"fixture-model\",\n base_url=\"https://provider.invalid/v1\",\n api_key=\"saved-secret\",\n )\n )\n app = NeuroCodeApp(\n TuiConversation(),\n provider_settings_store=store,\n managed_provider_settings=settings,\n provider_name=\"personal\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 44)) as pilot:\n await app.action_open_settings()\n await pilot.pause()\n self.assertIsInstance(app.screen, SettingsScreen)\n self.assertTrue(await pilot.click(\"#settings-category-background-wake\"))\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, BackgroundWakeSettingsScreen):\n break\n self.assertIsInstance(app.screen, BackgroundWakeSettingsScreen)\n self.assertTrue(await pilot.click(\"#background-wake-settings-enabled\"))\n self.assertTrue(await pilot.click(\"#background-wake-settings-save\"))\n for _ in range(20):\n await pilot.pause(0.01)\n if app.return_code is not None:\n break\n\n saved = await store.load()\n self.assertEqual(saved.background_task_wake_policy, BackgroundTaskWakePolicy.ENABLED)\n self.assertEqual(app.return_code, TUI_RELOAD_PROVIDER_SETTINGS)\n\n app = ProviderSetupApp(\n provider_settings=saved,\n provider_settings_store=store,\n first_run=False,\n initial_profile=\"personal\",\n )\n async with app.run_test(size=(110, 48)) as pilot:\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n screen = app.screen\n self.assertIsInstance(screen, ProviderSettingsScreen)\n self.assertEqual(\n screen.query_one(\"#provider-settings-wake-inherit\", Button).variant,\n \"primary\",\n )\n screen._select_background_wake_policy(BackgroundTaskWakePolicy.DISABLED)\n await screen._save_provider()\n for _ in range(20):\n await pilot.pause(0.01)\n if (await store.load()).profiles[0].background_task_wake_policy is not None:\n break\n\n updated = await store.load()\n self.assertEqual(\n updated.effective_background_task_wake_policy(\"personal\"),\n BackgroundTaskWakePolicy.DISABLED,\n )\n self.assertEqual(updated.background_task_wake_policy, BackgroundTaskWakePolicy.ENABLED)\n\n async def test_settings_edit_managed_provider_and_request_safe_reload(self) -> None:\n with tempfile.TemporaryDirectory() as directory:\n store = JsonProviderSettingsStore(Path(directory))\n settings = await store.save_profile(\n ManagedProviderProfile(\n name=\"personal\",\n protocol=\"openai-responses\",\n model=\"old-model\",\n base_url=\"https://api.openai.com/v1\",\n api_key=\"saved-secret\",\n )\n )\n app = NeuroCodeApp(\n TuiConversation(),\n provider_settings_store=store,\n managed_provider_settings=settings,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 40)) as pilot:\n await app.action_open_settings()\n await pilot.pause()\n self.assertIsInstance(app.screen, SettingsScreen)\n await pilot.click(\"#settings-category-providers\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n self.assertIsInstance(app.screen, ProviderSettingsScreen)\n await pilot.click(\"#provider-settings-profile-0\")\n model = app.screen.query_one(\"#provider-settings-model\", Input)\n model.value = \"updated-model\"\n self.assertEqual(\n app.screen.query_one(\"#provider-settings-api-key\", Input).value,\n \"\",\n )\n app.screen._select_proxy_mode(\"direct\")\n await pilot.click(\"#provider-settings-save\")\n for _ in range(20):\n await pilot.pause(0.01)\n if app.return_code is not None:\n break\n\n updated = await store.load()\n self.assertEqual(updated.profiles[0].model, \"updated-model\")\n self.assertEqual(updated.profiles[0].api_key, \"saved-secret\")\n self.assertEqual(updated.profiles[0].proxy_mode, \"direct\")\n self.assertEqual(app.return_code, TUI_RELOAD_PROVIDER_SETTINGS)\n\n async def test_settings_delete_requires_confirmation_and_reloads_safe_default(self) -> None:\n with tempfile.TemporaryDirectory() as directory:\n store = JsonProviderSettingsStore(Path(directory))\n await store.save_profile(\n ManagedProviderProfile(\n name=\"first\",\n protocol=\"openai-chat\",\n model=\"first-model\",\n base_url=\"https://first.invalid/v1\",\n proxy_mode=\"direct\",\n api_key=\"first-secret\",\n )\n )\n settings = await store.save_profile(\n ManagedProviderProfile(\n name=\"second\",\n protocol=\"openai-chat\",\n model=\"second-model\",\n base_url=\"https://second.invalid/v1\",\n proxy_mode=\"direct\",\n api_key=\"second-secret\",\n )\n )\n app = NeuroCodeApp(\n TuiConversation(),\n provider_settings_store=store,\n managed_provider_settings=settings,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 44)) as pilot:\n await app.action_open_settings()\n await pilot.pause()\n await pilot.click(\"#settings-category-providers\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSettingsScreen):\n break\n self.assertIsInstance(app.screen, ProviderSettingsScreen)\n await pilot.click(\"#provider-settings-profile-1\")\n delete = app.screen.query_one(\"#provider-settings-delete\", Button)\n self.assertFalse(delete.disabled)\n\n await pilot.click(\"#provider-settings-delete\")\n self.assertEqual(len((await store.load()).profiles), 2)\n self.assertIn(\"Confirm\", str(delete.label))\n await pilot.pause()\n\n await app.screen._delete_provider()\n for _ in range(20):\n await pilot.pause(0.01)\n if app.return_code is not None:\n break\n\n remaining = await store.load()\n self.assertEqual([profile.name for profile in remaining.profiles], [\"first\"])\n self.assertEqual(remaining.default_provider, \"first\")\n self.assertEqual(app.return_code, TUI_RELOAD_PROVIDER_SETTINGS)\n\n async def test_runtime_bar_shows_model_and_effort_and_localizes_labels(self) -> None:\n profiles = ProfileTuiController()\n app = NeuroCodeApp(\n TuiConversation(),\n provider_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n context_window_tokens=1_000_000,\n )\n\n async with app.run_test(size=(80, 24)) as pilot:\n model = app.query_one(\"#runtime-model\", Static)\n context = app.query_one(\"#runtime-context\", Static)\n effort = app.query_one(\"#runtime-effort\", Static)\n workspace = app.query_one(\"#runtime-workspace\", Static)\n mode = app.query_one(\"#runtime-mode\", Static)\n self.assertIn(\"MODEL\", str(model.renderable))\n self.assertIn(\"first · first-model\", str(model.renderable))\n self.assertIn(\"EFFORT\", str(effort.renderable))\n self.assertIn(\"● high\", str(effort.renderable))\n self.assertIn(\"CTX\", str(context.renderable))\n self.assertIn(\"~0.0%\", str(context.renderable))\n self.assertIn(\"CWD\", str(workspace.renderable))\n self.assertIn(str(Path(\"/workspace\")), str(workspace.renderable))\n self.assertIn(\"MODE\", str(mode.renderable))\n self.assertIn(\"normal\", str(mode.renderable))\n model_segments = list(app.console.render(model.renderable))\n effort_segments = list(app.console.render(effort.renderable))\n mode_segments = list(app.console.render(mode.renderable))\n self.assertIn(\n ACCENT_CODE.lower(),\n str(\n next(\n segment.style for segment in model_segments if \"first-model\" in segment.text\n )\n ).lower(),\n )\n self.assertIn(\n TEXT_EMPHASIS.lower(),\n str(\n next(segment.style for segment in effort_segments if \"high\" in segment.text)\n ).lower(),\n )\n self.assertIn(\n TEXT_EMPHASIS.lower(),\n str(\n next(segment.style for segment in mode_segments if \"normal\" in segment.text)\n ).lower(),\n )\n\n await app._language_settings_selected(UiLanguage.SIMPLIFIED_CHINESE)\n await pilot.pause()\n self.assertIn(\"模型\", str(model.renderable))\n self.assertIn(\"上下文\", str(context.renderable))\n self.assertIn(\"强度\", str(effort.renderable))\n self.assertIn(\"工作区\", str(workspace.renderable))\n self.assertIn(\"模式\", str(mode.renderable))\n self.assertIn(\"first · first-model\", str(model.renderable))\n\n app._provider_name = \"same-name\"\n app._model_name = \"same-name\"\n app._refresh_runtime_bar()\n self.assertEqual(str(model.renderable).count(\"same-name\"), 1)\n self.assertNotIn(\" · same-name\", str(model.renderable))\n\n async def test_shift_tab_cycles_modes_and_persists_safe_auto_preview(self) -> None:\n profiles = ProfileTuiController()\n preferences = UiPreferencesFixture()\n app = NeuroCodeApp(\n TuiConversation(),\n provider_controller=profiles,\n ui_preferences=preferences,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 26)) as pilot:\n await pilot.press(\"shift+tab\")\n await pilot.pause()\n self.assertEqual(profiles.mode_selections[-1], InteractionMode.ACCEPT_EDITS)\n self.assertEqual(preferences.saved_modes[-1], InteractionMode.ACCEPT_EDITS)\n self.assertIn(\n \"accept-edits\",\n str(app.query_one(\"#runtime-mode\", Static).renderable),\n )\n\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/mode auto\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(profiles.mode_selections[-1], InteractionMode.AUTO)\n self.assertIn(\"safe preview\", app.entries[-1].text)\n self.assertIn(\"auto\", str(app.query_one(\"#runtime-mode\", Static).renderable))\n\n async def test_context_bar_uses_provider_usage_and_status_reports_token_budget(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"deepseek\",\n model_name=\"deepseek-v4-pro\",\n cwd=Path(\"/workspace\"),\n context_window_tokens=1_000_000,\n )\n\n async with app.run_test(size=(90, 24)) as pilot:\n await app._handle_event(\n AgentEvent.create(\n 1,\n AgentEventKind.CONTEXT_USAGE_UPDATED,\n {\"used_tokens\": 850_000, \"estimated\": False},\n )\n )\n await pilot.pause()\n\n context = app.query_one(\"#runtime-context\", Static)\n self.assertIn(\"85.0%\", str(context.renderable))\n self.assertNotIn(\"~\", str(context.renderable))\n self.assertIn(\"850,000 / 1,000,000\", str(context.tooltip))\n context_segments = list(app.console.render(context.renderable))\n self.assertIn(\n ACCENT_WARNING.lower(),\n str(\n next(segment.style for segment in context_segments if \"85.0%\" in segment.text)\n ).lower(),\n )\n\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/status\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"Context: 85.0% (850,000/1,000,000)\", app.entries[-1].text)\n\n async def test_context_without_a_provider_window_shows_token_usage(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(90, 24)) as pilot:\n await app._handle_event(\n AgentEvent.create(\n 1,\n AgentEventKind.CONTEXT_USAGE_UPDATED,\n {\"used_tokens\": 1_536, \"estimated\": False},\n )\n )\n await pilot.pause()\n\n context = app.query_one(\"#runtime-context\", Static)\n self.assertIn(\"1.5k tok\", str(context.renderable))\n self.assertNotIn(\"?\", str(context.renderable))\n self.assertNotIn(\"Unknown\", str(context.renderable))\n self.assertEqual(context.tooltip, \"1.5k tok\")\n context_segments = list(app.console.render(context.renderable))\n self.assertIn(\n TEXT_SECONDARY.lower(),\n str(\n next(\n segment.style for segment in context_segments if \"1.5k tok\" in segment.text\n )\n ).lower(),\n )\n\n async def test_slash_commands_show_parameter_hints_and_tab_completes_first_option(\n self,\n ) -> None:\n runner = TuiConversation()\n profiles = ProfileTuiController()\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(90, 24)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n hints = app.query_one(\"#command-hints\", Static)\n prompt.value = \"/eff\"\n await pilot.pause()\n self.assertTrue(hints.display)\n self.assertIn(\"/effort LEVEL\", str(hints.renderable))\n\n await pilot.press(\"tab\")\n await pilot.pause()\n self.assertEqual(prompt.value, \"/effort\")\n self.assertIn(\"/effort low\", str(hints.renderable))\n\n await pilot.press(\"tab\")\n await pilot.pause()\n self.assertEqual(prompt.value, \"/effort low\")\n\n prompt.value = \"/provider\"\n await pilot.pause()\n await pilot.press(\"tab\")\n await pilot.pause()\n self.assertEqual(prompt.value, \"/provider first\")\n\n prompt.value = \"/resume\"\n await pilot.pause()\n self.assertIn(\"/resume SESSION_ID\", str(hints.renderable))\n await pilot.press(\"tab\")\n await pilot.pause()\n self.assertEqual(prompt.value, \"/resume \")\n\n prompt.value = \"ordinary prompt\"\n await pilot.pause()\n self.assertFalse(hints.display)\n self.assertEqual(runner.prompts, [])\n\n await pilot.press(\"ctrl+p\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSelectionScreen):\n break\n self.assertIsInstance(app.screen, ProviderSelectionScreen)\n focused_before = app.focused.id if app.focused is not None else None\n await pilot.press(\"tab\")\n await pilot.pause()\n self.assertNotEqual(\n app.focused.id if app.focused is not None else None,\n focused_before,\n )\n await pilot.press(\"ctrl+c\")\n\n async def test_effort_picker_switches_all_levels_and_marks_ultracode_fallback(\n self,\n ) -> None:\n profiles = ProfileTuiController()\n preferences = UiPreferencesFixture()\n app = NeuroCodeApp(\n TuiConversation(),\n provider_controller=profiles,\n ui_preferences=preferences,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(80, 24)) as pilot:\n await pilot.press(\"ctrl+e\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ReasoningEffortScreen):\n break\n\n self.assertIsInstance(app.screen, ReasoningEffortScreen)\n self.assertLessEqual(app.screen.query_one(\"#effort-dialog\").region.bottom, 24)\n labels = \"\\n\".join(str(button.label) for button in app.screen.query(Button))\n for effort in ReasoningEffort:\n self.assertIn(effort.value, labels)\n clicked = await pilot.click(\"#effort-choice-3\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if profiles.effort_selections:\n break\n\n self.assertEqual(profiles.effort_selections, [ReasoningEffort.XHIGH])\n self.assertEqual(preferences.saved_efforts, [ReasoningEffort.XHIGH])\n self.assertIn(\n \"⬤ xhigh\",\n str(app.query_one(\"#runtime-effort\", Static).renderable),\n )\n\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/effort ultracode\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual(profiles.effort_selections[-1], ReasoningEffort.ULTRACODE)\n self.assertIn(\"workflow orchestration is not implemented\", app.entries[-1].text)\n self.assertIn(\n \"⚡ ultracode → ⬤ xhigh\",\n str(app.query_one(\"#runtime-effort\", Static).renderable),\n )\n\n prompt.value = \"/status\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"Effort: ⚡ ultracode → ⬤ xhigh\", app.entries[-1].text)\n\n async def test_effort_validation_and_running_turn_guard_do_not_change_policy(self) -> None:\n runner = CancellableTuiConversation()\n profiles = ProfileTuiController()\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/effort impossible\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"Unknown effort\", app.entries[-1].text)\n self.assertEqual(profiles.effort_selections, [])\n\n prompt.value = \"long turn\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n prompt.value = \"/effort low\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual(profiles.effort_selections, [])\n self.assertEqual(\n app.entries[-1].text,\n \"Cannot change reasoning effort while a turn is running.\",\n )\n await pilot.press(\"ctrl+c\")\n\n async def test_narrow_runtime_bar_keeps_effort_visible_above_the_prompt(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"provider-with-a-very-long-name\",\n model_name=\"model-with-a-very-long-name\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(52, 18)) as pilot:\n await pilot.pause()\n runtime_bar = app.query_one(\"#runtime-bar\")\n context = app.query_one(\"#runtime-context\", Static)\n effort = app.query_one(\"#runtime-effort\", Static)\n mode = app.query_one(\"#runtime-mode\", Static)\n prompt = app.query_one(\"#prompt\", Input)\n self.assertLessEqual(runtime_bar.region.bottom, prompt.region.y)\n self.assertGreater(effort.region.width, 0)\n self.assertGreater(context.region.width, 0)\n self.assertGreater(mode.region.width, 0)\n self.assertIn(\"≈0 tok\", str(context.renderable))\n self.assertIn(\"● high\", str(effort.renderable))\n self.assertIn(\"normal\", str(mode.renderable))\n\n async def test_terminal_size_fallback_expands_the_full_screen_layout(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(80, 24)) as pilot:\n with patch(\"neuro_code.tui._read_terminal_size\", return_value=Size(132, 41)):\n app._synchronize_terminal_size()\n await pilot.pause()\n\n self.assertEqual(app.screen.size, Size(132, 41))\n self.assertEqual(app.screen.region.size, Size(132, 41))\n transcript = app.query_one(\"#transcript\", VerticalScroll)\n self.assertEqual(\n transcript.region.width + transcript.scrollbar_size_vertical,\n 132,\n )\n prompt = app.query_one(\"#prompt\", Input)\n self.assertGreater(prompt.region.width, 0)\n self.assertLessEqual(prompt.region.right, app.screen.size.width)\n shortcut_bar = app.query_one(\"#shortcut-bar\", Static)\n self.assertLess(prompt.region.bottom, shortcut_bar.region.y)\n self.assertGreater(shortcut_bar.region.height, 0)\n self.assertLessEqual(shortcut_bar.region.bottom, app.screen.size.height)\n\n async def test_tasks_command_lists_current_scope_without_rendering_command_or_output(\n self,\n ) -> None:\n runner = TuiConversation()\n tasks = TaskTuiController(\n (\n background_snapshot(\"task-running\", BackgroundTaskStatus.RUNNING),\n background_snapshot(\n \"task-failed\",\n BackgroundTaskStatus.FAILED,\n exit_code=7,\n ),\n )\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/tasks\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n rendered = next(\n entry.text\n for entry in reversed(app.entries)\n if \"task-running · running\" in entry.text\n )\n self.assertIn(\"task-running · running\", rendered)\n self.assertIn(\"task-failed · failed · exit 7\", rendered)\n self.assertIn(\"19 output bytes\", rendered)\n self.assertNotIn(\"private-command\", rendered)\n self.assertNotIn(\"private task output\", rendered)\n self.assertEqual(runner.prompts, [])\n\n async def test_tasks_command_includes_durable_plan_execution_records(self) -> None:\n plan = SessionPlan(\n (\n PlanStep(\"Inspect the current state\", PlanStepStatus.COMPLETED),\n PlanStep(\"Apply the reviewed change\", PlanStepStatus.IN_PROGRESS),\n ),\n \"Retain the execution revision for audit\",\n )\n task = SessionTask(\n \"task-plan\",\n SessionTaskKind.PLAN_EXECUTION,\n SessionTaskStatus.COMPLETED,\n datetime(2026, 7, 28, 9, 30, tzinfo=UTC),\n datetime(2026, 7, 28, 9, 31, tzinfo=UTC),\n plan_snapshot=plan,\n )\n profiles = ProfileTuiController(session_tasks=(task,))\n app = NeuroCodeApp(\n TuiConversation(),\n session_task_controller=profiles,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/tasks\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n rendered = app.entries[-1].text\n self.assertIn(\"task-plan · plan execution · completed\", rendered)\n self.assertIn(\"started\", rendered)\n self.assertIn(\"finished\", rendered)\n self.assertIn(f\"plan revision {plan.fingerprint[:12]}\", rendered)\n self.assertIn(\"1/2 completed\", rendered)\n\n async def test_tasks_command_handles_empty_unavailable_failing_and_truncated_views(\n self,\n ) -> None:\n unavailable = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with unavailable.run_test(size=(110, 35)) as pilot:\n prompt = unavailable.query_one(\"#prompt\", Input)\n prompt.value = \"/tasks\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"Task visibility is unavailable\", unavailable.entries[-1].text)\n\n prompt.value = \"/tasks unexpected\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"does not accept arguments\", unavailable.entries[-1].text)\n\n empty = NeuroCodeApp(\n TuiConversation(),\n task_controller=TaskTuiController(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with empty.run_test(size=(110, 35)) as pilot:\n prompt = empty.query_one(\"#prompt\", Input)\n prompt.value = \"/tasks\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"No tasks for the current session\", empty.entries[-1].text)\n\n failing = NeuroCodeApp(\n TuiConversation(),\n task_controller=FailingTaskTuiController(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with failing.run_test(size=(110, 35)) as pilot:\n prompt = failing.query_one(\"#prompt\", Input)\n prompt.value = \"/tasks\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"RuntimeError: task list failed\", failing.entries[-1].text)\n\n snapshots = tuple(\n background_snapshot(f\"task-{index}\", BackgroundTaskStatus.RUNNING)\n for index in range(21)\n )\n truncated = NeuroCodeApp(\n TuiConversation(),\n task_controller=TaskTuiController(snapshots),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with truncated.run_test(size=(110, 35)) as pilot:\n prompt = truncated.query_one(\"#prompt\", Input)\n prompt.value = \"/tasks\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"1 older task(s) omitted\", truncated.entries[-1].text)\n self.assertNotIn(\"task-0 ·\", truncated.entries[-1].text)\n self.assertIn(\"task-20 ·\", truncated.entries[-1].text)\n\n async def test_view_task_renders_a_historical_plan_snapshot_without_starting_a_turn(\n self,\n ) -> None:\n plan = SessionPlan(\n (\n PlanStep(\"Inspect the current state\", PlanStepStatus.COMPLETED),\n PlanStep(\"Apply the reviewed change\", PlanStepStatus.IN_PROGRESS),\n ),\n \"Retain the execution revision for audit\",\n )\n task = SessionTask(\n \"task-history\",\n SessionTaskKind.PLAN_EXECUTION,\n SessionTaskStatus.COMPLETED,\n datetime(2026, 7, 28, 9, 30, tzinfo=UTC),\n datetime(2026, 7, 28, 9, 31, tzinfo=UTC),\n plan_snapshot=plan,\n )\n runner = TuiConversation()\n app = NeuroCodeApp(\n runner,\n session_task_controller=ProfileTuiController(session_tasks=(task,)),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/view-task task-history\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n rendered = app.entries[-1].text\n self.assertIn(\"Plan execution task task-history\", rendered)\n self.assertIn(plan.fingerprint, rendered)\n self.assertIn(\"Retain the execution revision for audit\", rendered)\n self.assertIn(\"[completed] Inspect the current state\", rendered)\n self.assertIn(\"[in progress] Apply the reviewed change\", rendered)\n self.assertIn(\"read-only\", rendered)\n self.assertEqual(runner.prompts, [])\n\n async def test_view_task_reports_missing_or_legacy_plan_snapshots(self) -> None:\n legacy = SessionTask(\n \"task-legacy\",\n SessionTaskKind.PLAN_EXECUTION,\n SessionTaskStatus.COMPLETED,\n datetime(2026, 7, 28, 9, 30, tzinfo=UTC),\n datetime(2026, 7, 28, 9, 31, tzinfo=UTC),\n )\n app = NeuroCodeApp(\n TuiConversation(),\n session_task_controller=ProfileTuiController(session_tasks=(legacy,)),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/view-task missing-task\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"No durable task 'missing-task'\", app.entries[-1].text)\n\n prompt.value = \"/view-task task-legacy\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"has no saved plan snapshot\", app.entries[-1].text)\n\n async def test_view_task_requires_an_id_and_a_session_task_reader(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n session_task_controller=ProfileTuiController(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/view-task\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"Usage: /view-task TASK_ID\", app.entries[-1].text)\n\n unavailable = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with unavailable.run_test(size=(110, 35)) as pilot:\n prompt = unavailable.query_one(\"#prompt\", Input)\n prompt.value = \"/view-task task-history\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"Task visibility is unavailable\", unavailable.entries[-1].text)\n\n async def test_view_task_reports_a_reader_failure_without_starting_a_turn(self) -> None:\n runner = TuiConversation()\n app = NeuroCodeApp(\n runner,\n session_task_controller=FailingSessionTaskController(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/view-task task-history\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"RuntimeError: task read failed\", app.entries[-1].text)\n self.assertEqual(runner.prompts, [])\n\n async def test_terminal_task_notification_is_emitted_once_without_raw_output(\n self,\n ) -> None:\n runner = TuiConversation()\n tasks = TaskTuiController((background_snapshot(\"task-fast\", BackgroundTaskStatus.RUNNING),))\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)):\n await app._poll_background_tasks()\n tasks.snapshots = (\n background_snapshot(\n \"task-fast\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n ),\n )\n await app._poll_background_tasks()\n await app._poll_background_tasks()\n\n notifications = [\n entry.text for entry in app.entries if \"Background task task-fast\" in entry.text\n ]\n self.assertEqual(notifications, [\"Background task task-fast completed (exit 0).\"])\n self.assertNotIn(\"private task output\", \"\\n\".join(notifications))\n\n async def test_background_task_auto_wake_is_disabled_by_default(self) -> None:\n runner = AutoWakeTuiConversation()\n tasks = TaskTuiController(\n (\n background_snapshot(\n \"task-fast\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n ),\n )\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)):\n await app._poll_background_tasks()\n await app._poll_background_tasks()\n\n self.assertEqual(runner.wake_count, 0)\n\n async def test_background_task_auto_wake_is_opt_in_bounded_and_deduplicated(self) -> None:\n runner = AutoWakeTuiConversation()\n tasks = TaskTuiController(\n (\n background_snapshot(\n \"task-fast\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n ),\n )\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n await app._poll_background_tasks()\n for _ in range(20):\n await pilot.pause(0.01)\n if any(entry.category == \"assistant\" for entry in app.entries):\n break\n await app._poll_background_tasks()\n\n self.assertEqual(runner.wake_count, 1)\n self.assertIn(\n (\"status\", \"Background task completed; waking the model once.\"),\n [(entry.category, entry.text) for entry in app.entries],\n )\n self.assertIn(\n (\"assistant\", \"wake response\"),\n [(entry.category, entry.text) for entry in app.entries],\n )\n\n async def test_failed_background_wake_retains_pending_completion_for_retry(self) -> None:\n runner = FailingAutoWakeTuiConversation()\n tasks = TaskTuiController(\n (\n background_snapshot(\n \"task-fast\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n ),\n )\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED,\n background_wake_limits=BackgroundWakeLimits(cooldown_seconds=0.001),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n await app._poll_background_tasks()\n for _ in range(30):\n await pilot.pause(0.01)\n if any(\"wake provider failed\" in entry.text for entry in app.entries):\n break\n self.assertEqual(runner.wake_count, 1)\n self.assertEqual(tasks.wake_state.pending_task_ids, (\"task-fast\",))\n self.assertEqual(tasks.wake_state.wake_count, 0)\n self.assertFalse(tasks.wake_state.wake_in_flight)\n\n await app._poll_background_tasks()\n for _ in range(30):\n await pilot.pause(0.01)\n if runner.wake_count == 2:\n break\n\n self.assertEqual(runner.wake_count, 2)\n self.assertEqual(tasks.wake_state.pending_task_ids, (\"task-fast\",))\n self.assertEqual(tasks.wake_state.wake_count, 0)\n\n async def test_reported_background_completion_does_not_start_an_empty_wake(self) -> None:\n runner = AutoWakeTuiConversation()\n tasks = TaskTuiController(\n (\n background_snapshot(\n \"task-reported\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n completion_reported=True,\n ),\n )\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n await app._poll_background_tasks()\n await pilot.pause(0.05)\n\n self.assertEqual(runner.wake_count, 0)\n self.assertEqual(tasks.wake_state.pending_task_ids, ())\n\n async def test_background_task_auto_wake_can_be_enabled_from_slash_command(self) -> None:\n runner = AutoWakeTuiConversation()\n tasks = TaskTuiController(\n (\n background_snapshot(\n \"task-fast\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n ),\n )\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/auto-wake on\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.wake_count:\n break\n\n self.assertEqual(runner.wake_count, 1)\n self.assertIn(\n \"Background-task auto-wake is now enabled\",\n \"\\n\".join(entry.text for entry in app.entries),\n )\n\n async def test_auto_wake_on_creates_a_session_override_when_it_matches_the_global_default(\n self,\n ) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n managed_provider_settings=ManagedProviderSettings(\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED\n ),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)):\n self.assertIsNone(app._background_task_wake_policy_override)\n await app._apply_background_task_wake_policy(\"on\")\n self.assertIs(\n app._background_task_wake_policy_override,\n BackgroundTaskWakePolicy.ENABLED,\n )\n\n async def test_background_task_wake_state_survives_restart_without_duplicate_wake(self) -> None:\n tasks = TaskTuiController(\n (\n background_snapshot(\n \"task-fast\",\n BackgroundTaskStatus.COMPLETED,\n exit_code=0,\n ),\n )\n )\n first_runner = AutoWakeTuiConversation()\n first_app = NeuroCodeApp(\n first_runner,\n task_controller=tasks,\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with first_app.run_test(size=(110, 35)) as pilot:\n await first_app._poll_background_tasks()\n for _ in range(20):\n await pilot.pause(0.01)\n if first_runner.wake_count:\n break\n self.assertEqual(first_runner.wake_count, 1)\n self.assertEqual(tasks.wake_state.pending_task_ids, ())\n self.assertEqual(tasks.wake_state.wake_count, 1)\n\n second_runner = AutoWakeTuiConversation()\n second_app = NeuroCodeApp(\n second_runner,\n task_controller=tasks,\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n async with second_app.run_test(size=(110, 35)):\n await second_app._poll_background_tasks()\n await second_app._poll_background_tasks()\n self.assertEqual(second_runner.wake_count, 0)\n\n async def test_background_task_wake_budget_blocks_repeated_batches(self) -> None:\n runner = AutoWakeTuiConversation()\n tasks = TaskTuiController(\n (background_snapshot(\"task-fast\", BackgroundTaskStatus.COMPLETED, exit_code=0),)\n )\n app = NeuroCodeApp(\n runner,\n task_controller=tasks,\n background_task_wake_policy=BackgroundTaskWakePolicy.ENABLED,\n background_wake_limits=BackgroundWakeLimits(max_wakes_per_session=1),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n await app._poll_background_tasks()\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.wake_count:\n break\n tasks.snapshots = (\n background_snapshot(\"task-next\", BackgroundTaskStatus.COMPLETED, exit_code=0),\n )\n await app._poll_background_tasks()\n await pilot.pause(0.05)\n\n self.assertEqual(runner.wake_count, 1)\n self.assertIn(\"task-next\", tasks.wake_state.pending_task_ids)\n\n def test_session_picker_labels_saved_and_mismatched_sandbox_profiles(self) -> None:\n option = replace(\n SessionTuiController().options[1],\n selectable=False,\n sandbox_profile=SandboxProfile.STRICT,\n sandbox_profile_match=False,\n )\n\n label = SessionSelectionScreen._label(option)\n\n self.assertIn(\"sandbox strict\", label)\n self.assertIn(\"restart required\", label)\n self.assertIn(\"unavailable\", label)\n\n async def test_prompt_streams_events_and_commits_response(self) -> None:\n runner = TuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"inspect the repository\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if any(entry.category == \"assistant\" for entry in app.entries):\n break\n\n self.assertFalse(prompt.disabled)\n self.assertEqual(runner.prompts, [\"inspect the repository\"])\n entries = [(entry.category, entry.text) for entry in app.entries]\n self.assertIn((\"user\", \"inspect the repository\"), entries)\n self.assertIn((\"status\", \"Reasoning...\"), entries)\n self.assertIn((\"status\", \"Thought for 1.2s · model step 1\"), entries)\n tool_entries = [text for category, text in entries if category == \"tool\"]\n self.assertEqual(len(tool_entries), 1)\n self.assertEqual(tool_entries[0], \"✓ Read README.md · 420ms\")\n self.assertIn((\"assistant\", \"fixture response\"), entries)\n self.assertEqual(entries[-1], (\"status\", \"Turn completed in 2.8s · 1 model step(s)\"))\n self.assertNotIn(\"private\", \"\\n\".join(text for _, text in entries))\n\n async def test_tool_card_updates_in_place_and_renders_a_redacted_file_diff(self) -> None:\n app = NeuroCodeApp(\n TuiConversation(),\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 32)) as pilot:\n transcript = app.query_one(\"#transcript\", VerticalScroll)\n await app._handle_event(\n AgentEvent.create(\n 1,\n AgentEventKind.TOOL_REQUESTED,\n {\n \"id\": \"write\",\n \"name\": \"bash\",\n \"arguments\": {\n \"command\": \"printf 'API_KEY=sk-fixturesecret123' > src/new.py\"\n },\n },\n )\n )\n await pilot.pause()\n child_count = len(transcript.children)\n\n for event in (\n AgentEvent.create(\n 2,\n AgentEventKind.TOOL_PERMISSION,\n {\n \"id\": \"write\",\n \"name\": \"bash\",\n \"effect\": \"allow\",\n \"reason\": \"fixture policy\",\n },\n ),\n AgentEvent.create(\n 3,\n AgentEventKind.TOOL_STARTED,\n {\"id\": \"write\", \"name\": \"bash\"},\n ),\n AgentEvent.create(\n 4,\n AgentEventKind.TOOL_COMPLETED,\n {\n \"id\": \"write\",\n \"name\": \"bash\",\n \"content\": \"\",\n \"duration_seconds\": 0.125,\n \"workspace_changes\": {\n \"files\": [\n {\n \"path\": \"src/new.py\",\n \"status\": \"created\",\n \"additions\": 2,\n \"deletions\": 0,\n \"diff\": (\n \"--- /dev/null\\n\"\n \"+++ b/src/new.py\\n\"\n \"@@ -0,0 +1,2 @@\\n\"\n '+API_KEY = \"sk-fixturesecret123\"\\n'\n '+print(\"ready\")'\n ),\n \"diff_truncated\": False,\n }\n ],\n \"omitted_files\": 0,\n \"scan_limited\": False,\n },\n },\n ),\n ):\n await app._handle_event(event)\n await pilot.pause()\n self.assertEqual(len(transcript.children), child_count)\n\n tool_entries = [entry for entry in app.entries if entry.category == \"tool\"]\n self.assertEqual(len(tool_entries), 1)\n card = tool_entries[0].text\n self.assertIn(\"✓ bash(\", card)\n self.assertIn(\"├ Allowed · fixture policy\", card)\n self.assertIn(\"├ Created src/new.py (+2)\", card)\n self.assertIn(\"+++ b/src/new.py\", card)\n self.assertIn('+API_KEY = \"[REDACTED]\"', card)\n self.assertIn('+print(\"ready\")', card)\n self.assertIn(\"└ Completed · 125ms\", card)\n self.assertNotIn(\"sk-fixturesecret123\", card)\n\n rendered_segments = list(\n app.console.render(\n app.query_one(ToolFeedbackMessage).renderable,\n app.console.options.update(width=100),\n )\n )\n added_segments = [\n segment for segment in rendered_segments if '+print(\"ready\")' in segment.text\n ]\n removed_or_header_segments = [\n segment for segment in rendered_segments if \"--- /dev/null\" in segment.text\n ]\n command_segments = [segment for segment in rendered_segments if \"bash(\" in segment.text]\n success_segments = [segment for segment in rendered_segments if \"✓\" in segment.text]\n duration_segments = [\n segment for segment in rendered_segments if \"125ms\" in segment.text\n ]\n details_segments = [\n segment for segment in rendered_segments if \"Details shown\" in segment.text\n ]\n self.assertTrue(added_segments)\n self.assertIn(ACCENT_SUCCESS.lower(), str(added_segments[0].style).lower())\n self.assertIn(SURFACE_SELECTED.lower(), str(added_segments[0].style).lower())\n self.assertTrue(removed_or_header_segments)\n self.assertIn(ACCENT_ERROR.lower(), app._diff_line_style(\"-removed line\").lower())\n self.assertIn(SURFACE_HOVER.lower(), app._diff_line_style(\"-removed line\").lower())\n self.assertIn(ACCENT_CODE.lower(), str(command_segments[0].style).lower())\n self.assertIn(ACCENT_SUCCESS.lower(), str(success_segments[0].style).lower())\n self.assertIn(TEXT_SECONDARY.lower(), str(duration_segments[0].style).lower())\n self.assertIn(TEXT_SECONDARY.lower(), str(details_segments[0].style).lower())\n\n card_widget = app.query_one(ToolFeedbackMessage)\n self.assertTrue(card_widget.can_focus)\n self.assertIn(\"Details shown\", card)\n card_widget.focus()\n await pilot.press(\"enter\")\n await pilot.pause()\n\n collapsed_card = next(entry.text for entry in app.entries if entry.category == \"tool\")\n self.assertIn(\"Created src/new.py (+2)\", collapsed_card)\n self.assertIn(\"Details hidden\", collapsed_card)\n self.assertIn(\"Completed · 125ms\", collapsed_card)\n self.assertNotIn(\"+++ b/src/new.py\", collapsed_card)\n self.assertNotIn('+print(\"ready\")', collapsed_card)\n self.assertNotIn(\"sk-fixturesecret123\", collapsed_card)\n\n self.assertTrue(await pilot.click(card_widget, offset=(12, 0)))\n await pilot.pause()\n expanded_card = next(entry.text for entry in app.entries if entry.category == \"tool\")\n self.assertIn(\"+++ b/src/new.py\", expanded_card)\n self.assertIn('+print(\"ready\")', expanded_card)\n self.assertNotIn(\"sk-fixturesecret123\", expanded_card)\n\n await app._language_settings_selected(UiLanguage.SIMPLIFIED_CHINESE)\n await pilot.pause()\n localized_card = next(entry.text for entry in app.entries if entry.category == \"tool\")\n self.assertIn(\"已允许 · fixture policy\", localized_card)\n self.assertIn(\"新建 src/new.py\", localized_card)\n self.assertIn(\"+2\", localized_card)\n self.assertIn(\"完成 · 125ms\", localized_card)\n self.assertIn(\"已展开详细信息\", localized_card)\n\n async def test_local_slash_commands_do_not_call_the_model(self) -> None:\n runner = TuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/help\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"/status\", app.entries[-1].text)\n self.assertIn(\"/cancel\", app.entries[-1].text)\n self.assertIn(\"/sessions\", app.entries[-1].text)\n self.assertIn(\"/rename\", app.entries[-1].text)\n self.assertIn(\"/tasks\", app.entries[-1].text)\n self.assertIn(\"/view-task TASK_ID\", app.entries[-1].text)\n\n prompt.value = \"/status\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"fixture/fixture-model\", app.entries[-1].text)\n\n prompt.value = \"/clear\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual([entry.text for entry in app.entries], [\"Transcript cleared.\"])\n self.assertEqual(runner.prompts, [])\n\n async def test_plan_commands_show_the_saved_plan_and_start_a_plan_turn(self) -> None:\n plan = SessionPlan(\n (\n PlanStep(\"Inspect the current behavior\", PlanStepStatus.COMPLETED),\n PlanStep(\"Implement the safe follow-up\", PlanStepStatus.IN_PROGRESS),\n ),\n \"Keep the agreed work visible in this session\",\n )\n runner = TuiConversation()\n profiles = ProfileTuiController(plan)\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n interaction_mode_controller=profiles,\n plan_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/view-plan\"\n await pilot.press(\"enter\")\n await pilot.pause()\n displayed = app.entries[-1].text\n self.assertIn(\"Current plan:\", displayed)\n self.assertIn(\"Keep the agreed work visible\", displayed)\n self.assertIn(\"[in progress] Implement the safe follow-up\", displayed)\n\n prompt.value = \"/plan Verify the implementation before editing\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.prompts:\n break\n self.assertEqual(profiles.mode_selections, [InteractionMode.PLAN])\n self.assertEqual(runner.prompts, [\"Verify the implementation before editing\"])\n\n async def test_plan_comment_command_persists_and_renders_user_feedback(self) -> None:\n plan = SessionPlan(\n (\n PlanStep(\"Inspect the current behavior\", PlanStepStatus.COMPLETED),\n PlanStep(\"Implement the safe follow-up\", PlanStepStatus.IN_PROGRESS),\n ),\n )\n runner = TuiConversation()\n profiles = ProfileTuiController(plan)\n app = NeuroCodeApp(\n runner,\n plan_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/comment-plan 2 Keep the verification check explicit\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(len(await profiles.list_plan_comments()), 1)\n self.assertIn(\"Saved comment for plan step 2.\", app.entries[-2].text)\n self.assertIn(\"Comment: Keep the verification check explicit\", app.entries[-1].text)\n\n async def test_execute_plan_switches_only_to_accept_edits_and_records_the_handoff(self) -> None:\n plan = SessionPlan(\n (PlanStep(\"Implement the reviewed change\", PlanStepStatus.IN_PROGRESS),),\n \"Execute only after the user confirms\",\n )\n runner = TuiConversation()\n profiles = ProfileTuiController(plan)\n profiles._interaction_mode = InteractionMode.PLAN\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n interaction_mode_controller=profiles,\n plan_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/execute-plan\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if profiles.plan_execution_calls:\n break\n\n self.assertEqual(profiles.mode_selections, [InteractionMode.ACCEPT_EDITS])\n self.assertEqual(profiles.plan_execution_calls, 1)\n self.assertIn(\n \"Execution started from the current structured plan in accept-edits mode.\",\n [entry.text for entry in app.entries],\n )\n self.assertIn(\n \"Execute the current structured plan.\", [entry.text for entry in app.entries]\n )\n\n async def test_execute_plan_requires_a_saved_plan(self) -> None:\n runner = TuiConversation()\n profiles = ProfileTuiController()\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n interaction_mode_controller=profiles,\n plan_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/execute-plan\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(profiles.mode_selections, [])\n self.assertEqual(profiles.plan_execution_calls, 0)\n self.assertIn(\"No structured plan has been saved\", app.entries[-1].text)\n\n async def test_schedule_plan_queues_without_running_and_run_task_starts_it(self) -> None:\n plan = SessionPlan(\n (PlanStep(\"Run the queued plan\", PlanStepStatus.IN_PROGRESS),),\n \"Require an explicit start command\",\n )\n runner = TuiConversation()\n profiles = ProfileTuiController(plan)\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n interaction_mode_controller=profiles,\n plan_controller=profiles,\n session_task_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/schedule-plan\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(profiles.plan_execution_calls, 0)\n queued = profiles._session_tasks[0]\n self.assertIs(queued.status, SessionTaskStatus.QUEUED)\n self.assertIn(queued.task_id, app.entries[-1].text)\n\n prompt.value = f\"/run-task {queued.task_id}\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if profiles.plan_execution_calls:\n break\n\n self.assertEqual(profiles.plan_execution_calls, 1)\n self.assertIs(profiles._session_tasks[0].status, SessionTaskStatus.COMPLETED)\n self.assertIn(\"Run queued plan task\", \" \".join(entry.text for entry in app.entries))\n\n async def test_run_task_reports_missing_non_plan_and_non_queued_tasks(self) -> None:\n plan = SessionPlan((PlanStep(\"Run a plan\"),))\n timestamp = datetime(2026, 7, 29, 12, tzinfo=UTC)\n running = SessionTask(\n \"task-running\",\n SessionTaskKind.PLAN_EXECUTION,\n SessionTaskStatus.RUNNING,\n timestamp,\n plan_snapshot=plan,\n )\n subagent = SessionTask(\n \"task-subagent\",\n SessionTaskKind.SUBAGENT,\n SessionTaskStatus.QUEUED,\n timestamp,\n )\n profiles = ProfileTuiController(plan, session_tasks=(running, subagent))\n app = NeuroCodeApp(\n TuiConversation(),\n plan_controller=profiles,\n session_task_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n for task_id, expected in (\n (\"missing\", \"No durable task 'missing' exists\"),\n (\"task-subagent\", \"is not a plan execution task\"),\n (\"task-running\", \"is not queued\"),\n ):\n prompt.value = f\"/run-task {task_id}\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(expected, app.entries[-1].text)\n\n async def test_permission_modal_blocks_until_allow_once_is_selected(self) -> None:\n broker = SessionApprovalBroker()\n runner = ApprovalTuiConversation(broker)\n app = NeuroCodeApp(\n runner,\n approval_controller=broker,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"edit the file\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, PermissionApprovalScreen):\n break\n\n self.assertIsInstance(app.screen, PermissionApprovalScreen)\n self.assertFalse(runner.executed)\n approval_screen = app.screen\n assert isinstance(approval_screen, PermissionApprovalScreen)\n self.assertNotIn(\"private-old\", approval_screen.request.summary)\n self.assertNotIn(\"private-new\", approval_screen.request.summary)\n\n clicked = await pilot.click(\"#approval-allow-once\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.approvals:\n break\n\n self.assertTrue(runner.executed)\n self.assertEqual(runner.approvals[0].kind, PermissionApprovalKind.ALLOW_ONCE)\n\n async def test_permission_modal_defaults_to_deny(self) -> None:\n broker = SessionApprovalBroker()\n runner = ApprovalTuiConversation(broker)\n app = NeuroCodeApp(\n runner,\n approval_controller=broker,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"edit the file\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, PermissionApprovalScreen):\n break\n\n self.assertEqual(app.focused.id if app.focused is not None else None, \"approval-deny\")\n await pilot.press(\"ctrl+c\")\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.approvals:\n break\n\n self.assertFalse(runner.executed)\n self.assertEqual(runner.approvals[0].kind, PermissionApprovalKind.DENY)\n\n async def test_ctrl_c_cancels_a_running_turn_and_keeps_input_available(self) -> None:\n runner = CancellableTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"long turn\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n self.assertFalse(prompt.disabled)\n\n await pilot.press(\"ctrl+c\")\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.cancelled and any(\n entry.text == \"Turn cancelled.\" for entry in app.entries\n ):\n break\n\n self.assertTrue(runner.cancelled)\n self.assertIn(\"Cancellation requested.\", [entry.text for entry in app.entries])\n self.assertIn(\"Turn cancelled.\", [entry.text for entry in app.entries])\n self.assertEqual(runner.prompts, [\"long turn\"])\n\n async def test_pristine_cancel_restores_draft_and_removes_transcript_prompt(self) -> None:\n runner = PristineRewindTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"restore this prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n\n await pilot.press(\"ctrl+c\")\n for _ in range(30):\n await pilot.pause(0.02)\n if prompt.value == \"restore this prompt\" and runner.cancelled:\n break\n\n self.assertTrue(runner.cancelled)\n self.assertEqual(\n runner.policies,\n [TurnCancellationPolicy.REWIND_PRISTINE],\n )\n self.assertEqual(prompt.value, \"restore this prompt\")\n self.assertNotIn(\n \"restore this prompt\",\n [entry.text for entry in app.entries if entry.category == \"user\"],\n )\n self.assertIn(\n \"The cancelled prompt was restored to the draft.\",\n [entry.text for entry in app.entries],\n )\n\n async def test_pristine_cancel_preserves_original_prompt_when_a_newer_draft_exists(\n self,\n ) -> None:\n runner = PristineRewindTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"original prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n prompt.value = \"newer draft\"\n\n await pilot.press(\"ctrl+c\")\n for _ in range(30):\n await pilot.pause(0.02)\n if runner.cancelled:\n break\n\n self.assertEqual(prompt.value, \"newer draft\")\n self.assertIn(\n \"original prompt\",\n [entry.text for entry in app.entries if entry.category == \"user\"],\n )\n self.assertIn(\n \"The cancelled prompt remains above because a newer draft is already in the input.\",\n [entry.text for entry in app.entries],\n )\n\n async def test_pre_token_prompt_is_buffered_and_runs_after_current_turn(self) -> None:\n runner = PreTokenInterjectionConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n self.assertEqual(\n await asyncio.wait_for(runner.started.get(), timeout=1), \"first prompt\"\n )\n\n prompt.value = \"follow-up before first token\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual(runner.prompts, [\"first prompt\"])\n self.assertIn(\n \"Queued until the current response completes.\",\n [entry.text for entry in app.entries],\n )\n\n await runner.release.put(None)\n for _ in range(30):\n await pilot.pause(0.02)\n if runner.prompts == [\"first prompt\", \"follow-up before first token\"]:\n break\n self.assertEqual(runner.prompts, [\"first prompt\", \"follow-up before first token\"])\n\n await runner.release.put(None)\n for _ in range(30):\n await pilot.pause(0.02)\n if any(\n \"response to follow-up before first token\" in entry.text\n for entry in app.entries\n ):\n break\n self.assertTrue(\n any(\n \"response to follow-up before first token\" in entry.text\n for entry in app.entries\n )\n )\n\n async def test_prompt_after_first_token_keeps_running_turn_guard(self) -> None:\n runner = StreamingTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n\n prompt.value = \"late follow-up\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual(\n app.entries[-1].text,\n \"A turn is already running.\",\n )\n self.assertEqual(runner._session_id, \"streaming-session\")\n runner.release.set()\n\n async def test_cancelled_pre_token_turn_restores_buffered_prompt(self) -> None:\n runner = PreTokenInterjectionConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.get(), timeout=1)\n prompt.value = \"restore this follow-up\"\n await pilot.press(\"enter\")\n await pilot.press(\"ctrl+c\")\n for _ in range(30):\n await pilot.pause(0.02)\n if prompt.value == \"restore this follow-up\":\n break\n self.assertEqual(prompt.value, \"restore this follow-up\")\n self.assertEqual(runner.prompts, [\"first prompt\"])\n\n async def test_cancelled_pre_token_turn_restores_every_queued_prompt_without_autorun(\n self,\n ) -> None:\n runner = CancellableTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n for follow_up in (\"queued one\", \"queued two\"):\n prompt.value = follow_up\n await pilot.press(\"enter\")\n\n await pilot.press(\"ctrl+c\")\n for _ in range(30):\n await pilot.pause(0.02)\n if runner.cancelled:\n break\n\n self.assertEqual(prompt.value, \"queued one\\n\\nqueued two\")\n self.assertEqual(runner.prompts, [\"first prompt\"])\n self.assertFalse(app._queued_interjections)\n await pilot.pause(0.05)\n self.assertEqual(runner.prompts, [\"first prompt\"])\n\n async def test_pre_token_interjection_limit_keeps_the_unsent_prompt_in_the_input(self) -> None:\n runner = CancellableTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n for index in range(4):\n prompt.value = f\"queued {index}\"\n await pilot.press(\"enter\")\n prompt.value = \"fifth prompt\"\n await pilot.press(\"enter\")\n\n self.assertEqual(prompt.value, \"fifth prompt\")\n self.assertEqual(len(app._queued_interjections), 4)\n self.assertIn(\n \"Too many queued prompts; wait for the current turn to finish.\",\n [entry.text for entry in app.entries],\n )\n await pilot.press(\"ctrl+c\")\n\n async def test_clearing_the_transcript_discards_queued_interjections(self) -> None:\n runner = CancellableTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n prompt.value = \"stale queued prompt\"\n await pilot.press(\"enter\")\n self.assertTrue(app._queued_interjections)\n\n app.action_clear_transcript()\n self.assertFalse(app._queued_interjections)\n await pilot.press(\"ctrl+c\")\n for _ in range(30):\n await pilot.pause(0.02)\n if runner.cancelled:\n break\n\n self.assertEqual(runner.prompts, [\"first prompt\"])\n self.assertEqual(prompt.value, \"\")\n\n async def test_reasoning_delta_closes_the_pre_token_interjection_window(self) -> None:\n runner = CancellableTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"first prompt\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n await app._handle_event(\n AgentEvent.create(1, AgentEventKind.REASONING_DELTA, {\"text\": \"thinking\"})\n )\n prompt.value = \"late prompt\"\n await pilot.press(\"enter\")\n\n self.assertFalse(app._queued_interjections)\n self.assertEqual(app.entries[-1].text, \"A turn is already running.\")\n await pilot.press(\"ctrl+c\")\n\n async def test_cancel_command_cancels_without_starting_another_turn(self) -> None:\n runner = CancellableTuiConversation()\n app = NeuroCodeApp(\n runner,\n provider_name=\"fixture\",\n model_name=\"fixture-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"long turn\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n\n prompt.value = \"/cancel\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if runner.cancelled:\n break\n\n self.assertTrue(runner.cancelled)\n self.assertEqual(runner.prompts, [\"long turn\"])\n\n async def test_provider_picker_switches_profile_without_rendering_credentials(self) -> None:\n runner = TuiConversation()\n profiles = ProfileTuiController()\n app = NeuroCodeApp(\n runner,\n provider_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/provider\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSelectionScreen):\n break\n\n self.assertIsInstance(app.screen, ProviderSelectionScreen)\n missing = app.screen.query_one(\"#provider-choice-2\", Button)\n self.assertTrue(missing.disabled)\n rendered_labels = \"\\n\".join(str(button.label) for button in app.screen.query(Button))\n self.assertIn(\"credential missing\", rendered_labels)\n clicked = await pilot.click(\"#provider-choice-1\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if profiles.selections:\n break\n\n self.assertEqual(profiles.selections, [\"second\"])\n self.assertIn(\"previous session old-session remains saved\", app.entries[-1].text)\n self.assertIn(\n \"second · second-model\",\n str(app.query_one(\"#runtime-model\", Static).renderable),\n )\n\n prompt.value = \"/status\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"second/second-model\", app.entries[-1].text)\n self.assertIn(\"Profile: second\", app.entries[-1].text)\n\n await pilot.press(\"ctrl+p\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, ProviderSelectionScreen):\n break\n self.assertIsInstance(app.screen, ProviderSelectionScreen)\n await pilot.press(\"ctrl+c\")\n await pilot.pause()\n self.assertNotIsInstance(app.screen, ProviderSelectionScreen)\n self.assertEqual(profiles.selections, [\"second\"])\n\n async def test_model_alias_selects_directly_and_switch_is_blocked_mid_turn(self) -> None:\n profiles = ProfileTuiController()\n direct_runner = TuiConversation()\n direct_app = NeuroCodeApp(\n direct_runner,\n provider_controller=profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with direct_app.run_test(size=(100, 30)) as pilot:\n prompt = direct_app.query_one(\"#prompt\", Input)\n prompt.value = \"/model second\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(profiles.selections, [\"second\"])\n\n blocking_runner = CancellableTuiConversation()\n blocking_profiles = ProfileTuiController()\n blocking_app = NeuroCodeApp(\n blocking_runner,\n provider_controller=blocking_profiles,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with blocking_app.run_test(size=(100, 30)) as pilot:\n prompt = blocking_app.query_one(\"#prompt\", Input)\n prompt.value = \"long turn\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(blocking_runner.started.wait(), timeout=1)\n prompt.value = \"/provider second\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(blocking_profiles.selections, [])\n self.assertEqual(\n blocking_app.entries[-1].text,\n \"Cannot switch provider while a turn is running.\",\n )\n await pilot.press(\"ctrl+c\")\n\n async def test_initial_session_history_replays_without_private_context_or_tool_output(\n self,\n ) -> None:\n controller = SessionTuiController(current_session=\"target-session-123456789\")\n app = NeuroCodeApp(\n controller,\n session_controller=controller,\n initial_items=restored_history(),\n provider_name=\"second\",\n model_name=\"second-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(110, 35)) as pilot:\n await pilot.pause()\n\n rendered = \"\\n\".join(entry.text for entry in app.entries)\n self.assertIn(\"restored prompt\", rendered)\n self.assertIn(\"image content preserved in session\", rendered)\n self.assertIn(\"Restored tool request: read_file.\", rendered)\n self.assertIn(\"Restored result for read_file.\", rendered)\n self.assertIn(\"restored response\", rendered)\n self.assertIn(\"Resumed session target-session-123456789\", rendered)\n self.assertNotIn(\"never render this\", rendered)\n self.assertNotIn(\"private assistant reasoning\", rendered)\n self.assertNotIn(\"private tool output\", rendered)\n self.assertNotIn(\"private-image\", rendered)\n\n async def test_workspace_session_picker_resumes_and_replaces_transcript(self) -> None:\n controller = SessionTuiController()\n app = NeuroCodeApp(\n controller,\n session_controller=controller,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(115, 35)) as pilot:\n await pilot.press(\"ctrl+r\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, SessionSelectionScreen):\n break\n\n self.assertIsInstance(app.screen, SessionSelectionScreen)\n labels = \"\\n\".join(str(button.label) for button in app.screen.query(Button))\n self.assertIn(\"current\", labels)\n self.assertIn(\"target-sessi\", labels)\n clicked = await pilot.click(\"#session-choice-1\")\n self.assertTrue(clicked)\n for _ in range(20):\n await pilot.pause(0.01)\n if controller.selected:\n break\n\n self.assertEqual(controller.selected, [\"target-session-123456789\"])\n rendered = \"\\n\".join(entry.text for entry in app.entries)\n self.assertIn(\"restored prompt\", rendered)\n self.assertIn(\"Previous session current-session remains saved\", rendered)\n self.assertNotIn(\"Ready · first/first-model\", rendered)\n\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/status\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertIn(\"second/second-model\", app.entries[-1].text)\n self.assertIn(\"target-session-123456789\", app.entries[-1].text)\n\n await pilot.press(\"ctrl+r\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, SessionSelectionScreen):\n break\n await pilot.press(\"ctrl+c\")\n await pilot.pause()\n self.assertNotIsInstance(app.screen, SessionSelectionScreen)\n\n async def test_sessions_command_searches_titles_and_content_before_opening_picker(self) -> None:\n controller = SessionTuiController()\n app = NeuroCodeApp(\n controller,\n session_controller=controller,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(120, 35)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/sessions quoted\"\n await pilot.press(\"enter\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, SessionSelectionScreen):\n break\n\n self.assertIsInstance(app.screen, SessionSelectionScreen)\n self.assertEqual(controller.queries, [\"quoted\"])\n self.assertEqual(app.screen.search_query, \"quoted\")\n title = app.screen.query_one(\"#session-title\", Label)\n self.assertEqual(str(title.renderable), \"Session search: quoted\")\n self.assertNotIn(\"🔎\", str(title.renderable))\n labels = \"\\n\".join(str(button.label) for button in app.screen.query(Button))\n self.assertIn(\"Escaped quoted session\", labels)\n self.assertIn(\"[quoted] content\", labels)\n await pilot.press(\"escape\")\n\n async def test_session_picker_debounces_live_search_and_replaces_options(self) -> None:\n controller = SessionTuiController()\n app = NeuroCodeApp(\n controller,\n session_controller=controller,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(120, 35)) as pilot:\n await pilot.press(\"ctrl+r\")\n for _ in range(20):\n await pilot.pause(0.01)\n if isinstance(app.screen, SessionSelectionScreen):\n break\n\n self.assertIsInstance(app.screen, SessionSelectionScreen)\n search = app.screen.query_one(\"#session-search\", Input)\n search.value = \"quoted\"\n await pilot.pause(0.05)\n self.assertEqual(controller.queries, [None])\n for _ in range(30):\n await pilot.pause(0.02)\n labels = \"\\n\".join(str(button.label) for button in app.screen.query(Button))\n if (\n controller.queries[-1:] == [\"quoted\"]\n and \"Current workspace session\" not in labels\n and \"Escaped quoted session\" in labels\n ):\n break\n\n self.assertEqual(controller.queries, [None, \"quoted\"])\n labels = \"\\n\".join(str(button.label) for button in app.screen.query(Button))\n self.assertIn(\"Escaped quoted session\", labels)\n self.assertNotIn(\"Current workspace session\", labels)\n title = app.screen.query_one(\"#session-title\", Label)\n self.assertEqual(str(title.renderable), \"Session search: quoted\")\n await pilot.press(\"escape\")\n\n async def test_rename_and_title_commands_update_the_current_session(self) -> None:\n controller = SessionTuiController()\n app = NeuroCodeApp(\n controller,\n session_controller=controller,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"/rename Manual session title\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(controller.renamed, [\" Manual session title\"])\n self.assertIn(\"renamed to 'Manual session title'\", app.entries[-1].text)\n\n prompt.value = \"/title Alias title\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual(\n controller.renamed,\n [\" Manual session title\", \"Alias title\"],\n )\n self.assertIn(\"renamed to 'Alias title'\", app.entries[-1].text)\n\n async def test_direct_session_resume_is_blocked_while_a_turn_is_running(self) -> None:\n runner = CancellableTuiConversation()\n sessions = SessionTuiController()\n app = NeuroCodeApp(\n runner,\n session_controller=sessions,\n provider_name=\"first\",\n model_name=\"first-model\",\n cwd=Path(\"/workspace\"),\n )\n\n async with app.run_test(size=(100, 30)) as pilot:\n prompt = app.query_one(\"#prompt\", Input)\n prompt.value = \"long turn\"\n await pilot.press(\"enter\")\n await asyncio.wait_for(runner.started.wait(), timeout=1)\n\n prompt.value = \"/resume target-session-123456789\"\n await pilot.press(\"enter\")\n await pilot.pause()\n\n self.assertEqual(sessions.selected, [])\n self.assertEqual(\n app.entries[-1].text,\n \"Cannot resume a session while a turn is running.\",\n )\n prompt.value = \"/rename Blocked title\"\n await pilot.press(\"enter\")\n await pilot.pause()\n self.assertEqual(sessions.renamed, [])\n self.assertEqual(\n app.entries[-1].text,\n \"Cannot rename a session while a turn is running.\",\n )\n await pilot.press(\"ctrl+c\")\n\n\nif __name__ == \"__main__\":\n unittest.main()\n"}}}}