Skip to content

Commit 6d1144e

Browse files
committed
feat: log effective Windows local runtime shell
1 parent dd9da23 commit 6d1144e

2 files changed

Lines changed: 61 additions & 1 deletion

File tree

astrbot/core/computer/computer_client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import os
44
import shutil
5+
import sys
56
import time
67
import uuid
78
from dataclasses import dataclass
@@ -16,7 +17,7 @@
1617
)
1718

1819
from .booters.base import ComputerBooter
19-
from .booters.local import LocalBooter
20+
from .booters.local import LocalBooter, resolve_windows_shell
2021

2122
session_booter: dict[str, ComputerBooter] = {}
2223
local_booter: ComputerBooter | None = None
@@ -688,6 +689,11 @@ def get_local_booter() -> ComputerBooter:
688689
global local_booter
689690
if local_booter is None:
690691
local_booter = LocalBooter()
692+
if sys.platform == "win32":
693+
logger.info(
694+
"[Computer] Windows local runtime shell: %s",
695+
resolve_windows_shell(),
696+
)
691697
return local_booter
692698

693699

tests/unit/test_computer.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,60 @@ def test_get_local_booter(self):
507507
# Reset for other tests
508508
computer_client.local_booter = None
509509

510+
@pytest.mark.parametrize("shell_executable", ["pwsh.exe", "powershell.exe"])
511+
def test_get_local_booter_logs_windows_shell_once(
512+
self,
513+
monkeypatch,
514+
shell_executable,
515+
):
516+
"""Test Windows effective shell is logged once per local booter."""
517+
from astrbot.core.computer import computer_client
518+
519+
mock_logger = MagicMock()
520+
mock_resolver = MagicMock(return_value=shell_executable)
521+
monkeypatch.setattr(computer_client, "local_booter", None)
522+
monkeypatch.setattr(computer_client.sys, "platform", "win32")
523+
monkeypatch.setattr(computer_client, "logger", mock_logger)
524+
monkeypatch.setattr(
525+
computer_client,
526+
"resolve_windows_shell",
527+
mock_resolver,
528+
)
529+
530+
booter1 = computer_client.get_local_booter()
531+
booter2 = computer_client.get_local_booter()
532+
533+
assert booter1 is booter2
534+
mock_resolver.assert_called_once_with()
535+
mock_logger.info.assert_called_once_with(
536+
"[Computer] Windows local runtime shell: %s",
537+
shell_executable,
538+
)
539+
540+
def test_get_local_booter_skips_windows_shell_log_outside_windows(
541+
self,
542+
monkeypatch,
543+
):
544+
"""Test non-Windows local booters skip Windows shell resolution logs."""
545+
from astrbot.core.computer import computer_client
546+
547+
mock_logger = MagicMock()
548+
mock_resolver = MagicMock()
549+
monkeypatch.setattr(computer_client, "local_booter", None)
550+
monkeypatch.setattr(computer_client.sys, "platform", "linux")
551+
monkeypatch.setattr(computer_client, "logger", mock_logger)
552+
monkeypatch.setattr(
553+
computer_client,
554+
"resolve_windows_shell",
555+
mock_resolver,
556+
)
557+
558+
booter = computer_client.get_local_booter()
559+
560+
assert isinstance(booter, LocalBooter)
561+
mock_resolver.assert_not_called()
562+
mock_logger.info.assert_not_called()
563+
510564
@pytest.mark.asyncio
511565
async def test_shutdown_local_booter_clears_singleton(self):
512566
"""Test local managed resources are released during lifecycle shutdown."""

0 commit comments

Comments
 (0)