feat(desktop-wake): add WeCom UIA warm-tree and ship n2-wake in 1.2.3
All checks were successful
Publish Python Package to Gitea / publish (push) Successful in 29s

Expose ensure_ui_ready via DuiLib GetAccessible inject path; package x86 native helpers for host/skill consumers.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-02 08:42:38 +08:00
parent 3dc46b0555
commit 71091e38a9
29 changed files with 3088 additions and 3 deletions

View File

@@ -0,0 +1,60 @@
"""ensure_ui_ready:probe → wake → probe。"""
from __future__ import annotations
from typing import Optional, Union
from .errors import DesktopWakeError, ERR_PROVIDER_COLD, ERR_WAKE_FAILED
from .probe import probe
from .profiles import load_profile
from .types import EnsureResult, Profile
from .wake import wake
from .window import find_hwnd_for_profile, require_windows
def ensure_ui_ready(
profile: Union[str, Profile] = "wecom",
*,
hwnd: Optional[int] = None,
raise_on_cold: bool = True,
) -> EnsureResult:
"""保证目标窗 UIA 树可用。
已暖则直接返回;否则跑唤醒策略梯再探测。
``raise_on_cold=True``(默认)时仍冷则抛 ``DesktopWakeError``。
"""
require_windows()
prof = load_profile(profile) if isinstance(profile, str) else profile
h = find_hwnd_for_profile(prof, hwnd=hwnd)
before = probe(prof, hwnd=h)
if before.warm:
return EnsureResult(
hwnd=h,
profile_id=prof.id,
warm=True,
probe_before=before,
probe_after=before,
steps=[],
wake_applied=False,
)
steps = wake(prof, hwnd=h, stop_when_warm=True)
after = probe(prof, hwnd=h)
result = EnsureResult(
hwnd=h,
profile_id=prof.id,
warm=after.warm,
probe_before=before,
probe_after=after,
steps=steps,
wake_applied=True,
)
if after.warm or not raise_on_cold:
return result
code = ERR_WAKE_FAILED if steps else ERR_PROVIDER_COLD
raise DesktopWakeError(
code,
f"profile={prof.id} hwnd={h} findall={after.findall_count} "
f"missing={after.markers_missing} notes={after.notes}",
)