dsh-codex-style-computer-use 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ar.md +234 -0
- package/README.de.md +234 -0
- package/README.es.md +264 -0
- package/README.fa.md +234 -0
- package/README.fr.md +243 -0
- package/README.md +41 -8
- package/README.pt.md +234 -0
- package/README.ru.md +259 -0
- package/README.zh.md +41 -8
- package/icon.svg +20 -4
- package/lib/bin/attention-worker.exe +0 -0
- package/lib/bin/attention-worker.exe.json +1 -1
- package/lib/core/bin/dsh-computer-use-worker.exe +0 -0
- package/lib/core/bin/dsh-computer-use-worker.exe.json +2 -2
- package/lib/core/index.js +31 -0
- package/lib/core/worker.cs +380 -10
- package/lib/image-output.js +28 -6
- package/lib/launch.js +67 -0
- package/lib/policy.js +22 -2
- package/lib/tools.js +74 -8
- package/package.json +5 -1
- package/scripts/verify-package.mjs +9 -0
- package/skills/computer-use/SKILL.md +50 -50
package/README.ru.md
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Computer Use в стиле Codex
|
|
2
|
+
|
|
3
|
+
**Самый точный способ управлять Windows из DeepSeek Harness — и самый дешёвый в расчёте на задачу.**
|
|
4
|
+
|
|
5
|
+
Опишите цель. Агент считывает точные идентификаторы элементов управления, действует через сами элементы, проверяет результат — и выполняет известную последовательность за один цикл обращения к модели вместо десяти.
|
|
6
|
+
|
|
7
|
+
[English](README.md) | [中文](README.zh.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Português](README.pt.md) | [العربية](README.ar.md) | **Русский** | [فارسی](README.fa.md) · [Установка](#install-and-update-in-dsh-market) · [Журнал изменений](CHANGELOG.md) · [Изменения 2.0.0](docs/RELEASE-2.0.0.md)
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## Почему он самый точный
|
|
12
|
+
|
|
13
|
+
- **Идентификаторы, а не догадки.** UI Automation предоставляет реальное дерево элементов управления с точными `AutomationId`, а действия могут управлять элементом через его собственные шаблоны UI Automation вместо кликов по координатам.
|
|
14
|
+
- **Метки проверяются, а не принимаются на веру.** По умолчанию нумерованная метка сверяется с идентичностью окна и выборочно проверенными пикселями до отправки любого ввода, поэтому устаревшая метка отклоняется, а не приводит к клику в неверном месте. Когда анимированный соседний элемент постоянно нарушает пиксельную подпись, `uiaOnly` привязывает идентичность к дескриптору окна и геометрии, при этом проверка перекрытия в момент отправки по-прежнему выполняется.
|
|
15
|
+
- **Запросы остаются ограниченными.** Запросы UIA по умолчанию используют глубину 6, 120 узлов и мягкий бюджет 1200 мс; запрос глубже 6 или содержащий больше 300 узлов требует измеренного `anchor`, поэтому запрос не может незаметно обойти неверную область.
|
|
16
|
+
- **Если не видно — прочитайте.** `computer_ocr` возвращает строки и рамки каждого слова в абсолютных пикселях экрана, поэтому приложения без поддержки UIA можно находить по названию.
|
|
17
|
+
|
|
18
|
+
## Почему это дешевле
|
|
19
|
+
|
|
20
|
+
- **Один цикл для известной последовательности.** Один вызов `computer_batch` последовательно выполняет список действий, останавливается на первой ошибке и стоит один цикл обращения к модели вместо одного на каждое действие.
|
|
21
|
+
- **Возвращается только разница.** Передайте идентификатор предыдущего наблюдения в `since` и получите добавления, изменения, удаления и порядок — а не всё дерево заново.
|
|
22
|
+
- **Компактные отчёты по умолчанию в 2.0.0.** Текст после действия обычно добавляет не более 6 КиБ к отчёту о действии; `feedback: full` по-прежнему доступен, когда важнее подробность.
|
|
23
|
+
- **Доказательства не попадают в диалог.** Полные доказательства по точке могут храниться в ограниченном локальном кэше (4 МиБ памяти, 32 МиБ на диске, 64 записи, срок 24 часа) и извлекаться по запросу.
|
|
24
|
+
- **Локальная работа остаётся локальной.** UI Automation, OCR экрана и проверки пикселей выполняются в готовом нативном воркере — без дополнительных расходов на компьютерное зрение на каждом шаге.
|
|
25
|
+
|
|
26
|
+
## Создан для рабочего стола, которым вы продолжаете пользоваться
|
|
27
|
+
|
|
28
|
+
- **Он ждёт вас.** Уведомление за 1 секунду до ввода (0,1 секунды в пределах скользящего 3-минутного окна) сразу возвращает вам рабочий стол; когда вы закончите, агент повторно наблюдает состояние и продолжает исходную задачу.
|
|
29
|
+
- **Тормоз доходит до модели.** `Ctrl+Esc` приостанавливает, `Ctrl+Alt+R` возобновляет, `Ctrl+Alt+Q` завершает работу, а остановка передаётся в текущую сессию. Подтверждения по умолчанию включены, а ввод в поля паролей по умолчанию отклоняется.
|
|
30
|
+
- **Он сообщает о том, чего не может.** Защищённый рабочий стол Windows (запрос UAC или экран блокировки) обнаруживается, о нём сообщается, а после него работа возобновляется — без слепых повторных попыток.
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+

|
|
35
|
+
|
|
36
|
+
Иллюстрации выше показывают модель взаимодействия, появившуюся в 1.3.0; указатель-«воздушный змей» версии 2.0.0, ограниченные запросы и компактные отчёты описаны выше. Фактический расход токенов зависит от задачи, модели и стратегии наблюдения. Подтверждения по умолчанию остаются включёнными; явные пауза, отмена и выход сохраняют приоритет.
|
|
37
|
+
|
|
38
|
+
**Готово к установке.** 19 инструментов рабочего стола вместе с нативными помощниками. Без SDK и без компиляции при установке. Требуются Windows, Node.js ≥ 22 и .NET Framework 4.x, входящий в состав Windows. Независимый плагин сообщества; Codex описывает стиль взаимодействия.
|
|
39
|
+
|
|
40
|
+
## Новое в 2.0.0
|
|
41
|
+
|
|
42
|
+
- **Компактные отчёты по умолчанию** — текст после действия обычно добавляет не более 6 КиБ к отчёту о действии; `feedback: full` и `feedback: none` — явные альтернативы.
|
|
43
|
+
- **Ограниченные запросы UIA с привязкой** — по умолчанию глубина 6, 120 узлов и мягкий бюджет 1200 мс; запросы глубже 6 или содержащие больше 300 узлов требуют измеренного `anchor`.
|
|
44
|
+
- **Доказательства по запросу** — 4 МиБ памяти + 32 МиБ диска, 64 записи, срок 24 часа; при сбое диска используется ограниченная память.
|
|
45
|
+
- **Адаптивное уведомление о подготовке** — 1 секунда вначале, 0,1 секунды в пределах скользящего 3-минутного окна; наклонённый «воздушный змей» отмечает точку клика агента.
|
|
46
|
+
- **Укреплённый путь ввода** — защищённые сочетания клавиш для управления окнами, противодавление и восстановление воркера, проверки устаревших целей и очистка при отмене.
|
|
47
|
+
|
|
48
|
+
<details>
|
|
49
|
+
<summary>Текущий выпуск и совместимость</summary>
|
|
50
|
+
|
|
51
|
+
**2.0.0** — новый мажорный выпуск, который сначала распространяется в npm под тегом `next`, пока действует 24-часовой период ожидания перед выпуском. См. [изменения и миграцию 2.0.0](docs/RELEASE-2.0.0.md). Актуальную доступность стабильной версии проверяйте по тегам реестра.
|
|
52
|
+
|
|
53
|
+
Версия 1.3.1 читает текст с экрана и находит элементы по названию, замечает защищённый рабочий стол Windows и самостоятельно возобновляет работу, а также удерживает все цвета на одной вычисляемой из DPI полосе по краю с видимым «дышащим» минимумом. Версия 1.3.0 освобождает управление рабочим столом, когда работа завершается, а чат продолжается.
|
|
54
|
+
|
|
55
|
+
Более ранние исправления: [атрибуция подтверждений в 1.2.3](docs/RELEASE-1.2.3.md) · [нативное внимание в 1.2.1](docs/RELEASE-1.2.1.md) · [патч автономного хоста](docs/RELEASE-1.2.2.md).
|
|
56
|
+
|
|
57
|
+
</details>
|
|
58
|
+
|
|
59
|
+
## Что он делает
|
|
60
|
+
|
|
61
|
+
Версия 2.0.0 также использует компактный синий указатель-«воздушный змей» во время работы ИИ и удержания сцены. Его наклонённый кончик отмечает точку клика, а внутри змея размещены маленькие символы текста и изменения размера. «Дышащий» змей означает, что страница и положение указателя должны оставаться на месте; свободный режим возвращает приложению обычный курсор. Тема курсора Windows пользователя сохраняется.
|
|
62
|
+
|
|
63
|
+
Версия 2.0.0 ограничивает обход UIA и по умолчанию использует компактный текст после действия. Существующая обратная связь в виде изображений остаётся доступной; `feedback: compact|full|none` управляет степенью подробности, а параметр клика `verificationRegion: "x,y,w,h"` задаёт ожидаемую область эффекта независимо от точки ввода. Компактный текст обычно добавляет не более 6 КиБ к исходному отчёту о действии. Полные доказательства по точке можно сохранять в ограниченном локальном кэше с истекающим сроком и извлекать по запросу. При сбое диска происходит возврат к ограниченной памяти; если не удаётся сохранить ни одного извлекаемого снимка, текущие доказательства возвращаются полностью прямо в ответе, вне рамок компактного бюджета, без дополнительного наблюдения или ввода.
|
|
64
|
+
|
|
65
|
+
Отфильтрованные запросы UIA требуют `hwnd`. По умолчанию используются глубина 6, 120 узлов и мягкий бюджет 1200 мс. Запрос глубже 6 или содержащий больше 300 узлов требует измеренного `anchor:"x,y"` в этом окне; точный `id` не обходит это правило. Вызов провайдера может превысить мягкий бюджет, а частичные результаты не позволяют доказать отсутствие или уникальность. После сочетания клавиш управления окнами проверьте `computer_state {windows:true}`, успешно активируйте нужное окно и получите его наблюдение, прежде чем продолжать ввод с клавиатуры.
|
|
66
|
+
|
|
67
|
+
- **Наблюдение** — список окон, снимки экрана (область / JPEG / PNG / с уменьшением), карта Set-of-Marks
|
|
68
|
+
кликабельных элементов и дерево UI Automation с точными `AutomationId`.
|
|
69
|
+
- **Действие** — клик, перемещение, перетаскивание, прокрутка, выделение диапазона текста, ввод, нажатия клавиш
|
|
70
|
+
и управление элементами через их собственные шаблоны UI Automation вместо слепых координат.
|
|
71
|
+
- **Пакет** — один вызов `computer_batch` последовательно выполняет список действий и останавливается
|
|
72
|
+
на первой ошибке, поэтому известная последовательность стоит один цикл обращения к модели вместо десяти.
|
|
73
|
+
- **Вопрос** — `computer_ask` задаёт вопрос на той же карточке чата, которую DSH использует для
|
|
74
|
+
`ask_user_question`, без обратного отсчёта.
|
|
75
|
+
- **Человеческий тормоз, который доходит до модели** — остановка передаётся в текущую сессию, поэтому агент
|
|
76
|
+
узнаёт о прерывании, а не обнаруживает его на следующем шаге.
|
|
77
|
+
|
|
78
|
+
Инструменты наблюдают за рабочим столом, а не сканируют документы пользователя. Плагин управляет нативными помощниками в
|
|
79
|
+
`%LOCALAPPDATA%\dsh-computer-use\worker\`, а также журналами аудита, снимками экрана и собственным ограниченным
|
|
80
|
+
`observation-cache` в `$DSH_HOME/data/computer-use/`. `computer_ctrl {action:"clear_cache"}` очищает
|
|
81
|
+
кэш наблюдений этого Агента; он не удаляет снимки экрана, вложения или документы пользователя.
|
|
82
|
+
|
|
83
|
+
<a id="install-and-update-in-dsh-market"></a>
|
|
84
|
+
## Установка и обновление в dsh-market
|
|
85
|
+
|
|
86
|
+
Найдите в маркетплейсе **computer-use** или **Codex-style**. Выберите репозиторий **ltmroberthk915/dsh-computer-use** и npm-пакет **dsh-codex-style-computer-use** (сопровождающий: **ltmroberthk**), затем нажмите **Установить**. Для обновлений по стабильному каналу используйте **Обновить** или **Обновить все**. Оба нативных помощника включены; PowerShell 7 или разрешение на сборку не требуются.
|
|
87
|
+
|
|
88
|
+
Либо введите **`dsh-codex-style-computer-use`** в **Настройки → Плагины → Добавить плагин** для текущего стабильного канала или **`dsh-codex-style-computer-use@2.0.0`** для версии, описанной на этой странице. Указывайте спецификацию npm-пакета напрямую. Ваш хост может применять период ожидания к новым версиям; следуйте его указаниям. Вновь добавленный бандл может загрузиться на лету на поддерживаемых хостах; проверьте, что его инструменты и skill появились. Перезапустите DSH из трея при замене уже загруженной версии, если клиент остаётся устаревшим или если DSH сообщает **restart-required**.
|
|
89
|
+
|
|
90
|
+
### Выпуски, опубликованные менее 24 часов назад
|
|
91
|
+
|
|
92
|
+
Конфигурация pnpm 11.7.0 по умолчанию (нестрогая) автоматически записывает исключение для одной версии и выполняет установку. Успешная установка на одной машине не означает, что другая машина разрешает свежие версии.
|
|
93
|
+
|
|
94
|
+
При `minimumReleaseAgeStrict: true` (или политике хоста, включающей строгие проверки возраста выпуска) и при отсутствии подходящего исключения версия, не достигшая заданного возраста, отклоняется до запуска кода плагина. Для голого имени, точного закрепления `@1.2.0` и URL npm-архива проверено, что при такой политике все они завершаются ошибкой `ERR_PNPM_NO_MATURE_MATCHING_VERSION`. Явное указание `minimumReleaseAge: 1440` также включает строгое поведение в pnpm 11.7.0, если только `minimumReleaseAgeStrict` отдельно не установлен в false. Перезапуск DSH, установка PowerShell или повтор той же команды не устраняют отказ по строгой политике. Официальный мост приложения Desktop не принимает дополнительные флаги pnpm.
|
|
95
|
+
|
|
96
|
+
Если строгая политика блокирует установку, дождитесь, пока версия достигнет заданного возраста, и устанавливайте, не меняя политику. Версия 1.2.0 опубликована в `2026-10-03T03:50:11.586Z`; 24-часовой порог она проходит после **2026-10-04 03:50:12 UTC** (11:50:12 по времени Китая). Более длинный настроенный порог или отстающее зеркало реестра могут дополнительно отложить доступность. Пользователям с конфигурацией по умолчанию (нестрогой) не нужно ждать или менять конфигурацию для этого пакета.
|
|
97
|
+
|
|
98
|
+
Если вы явно решаете установить раньше, добавьте это исключение для одной версии в существующий `pnpm-workspace.yaml` целевого профиля, а затем повторите установку из маркетплейса. Сохраните остальные записи; не отключайте глобальную политику возраста:
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
minimumReleaseAgeExclude:
|
|
102
|
+
- dsh-codex-style-computer-use@1.2.0
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Путь по умолчанию для профиля desktop — `%USERPROFILE%\.dsh\profiles\desktop\pnpm-workspace.yaml`; используйте фактический каталог, если `DSH_HOME` изменён. После того как версия «созреет», это единственное исключение можно удалить.
|
|
106
|
+
|
|
107
|
+
Прежние исправления документации и проверки публикатора не изменили среду выполнения 1.2.0 и не требовали переустановки. Исправление нативного внимания в **1.2.1** действительно требует обновления. Повторное добавление того же источника на некоторых путях установки может вызвать ошибку хоста `ambiguous-install`; переустановка 1.2.0 не применит исправление 1.2.1.
|
|
108
|
+
|
|
109
|
+
**Миграция более старой установки Git/tarball из этого репозитория:** удалите в маркетплейсе старую запись **dsh-computer-use**, затем установите **dsh-codex-style-computer-use**. Имя npm без скоупа `dsh-computer-use` принадлежит другому репозиторию; не устанавливайте его как обновление этого плагина. Установка из Git не может сменить идентичность зависимости, просто получив новый коммит. После этой однократной миграции в интерфейсе используйте обычные обновления из маркетплейса. Существующие имена инструментов `computer_*` и пространство настроек `computer-use` сохраняются.
|
|
110
|
+
|
|
111
|
+
**Сохраните и свою конфигурацию:** сделайте резервную копию `cordis.patch.yml` профиля, затем измените только `name: dsh-computer-use` в переопределении с `id: computer-use` на `name: dsh-codex-style-computer-use`. Сохраните целиком поля `config` и `disabled`. Одного лишь сохранения пространства настроек недостаточно: при несовпадении имени DSH пропустит даже переопределения `read-only`, `dryRun` и отключённого состояния. Не заменяйте глобально другие плагины или общий патч уровня home. Скрипт репозитория `scripts/migrate-profile.mjs` по умолчанию показывает предварительный просмотр; `--apply` создаёт резервную копию и атомарно заменяет файл, отказываясь от параллельных изменений.
|
|
112
|
+
|
|
113
|
+
Либо скачайте [утилиту миграции конфигурации](https://github.com/ltmroberthk915/dsh-computer-use/releases/download/v1.2.0/computer-use-profile-migration.zip), распакуйте её и дважды щёлкните `migrate-profile.cmd`. Она находит установленное официальное приложение Desktop и использует Windows PowerShell 5.1 вместе со встроенным в DSH Node, чтобы исправить профиль desktop по умолчанию. Она останавливается, если новый бандл отсутствует или всё ещё выбран старый бандл. Она не меняет политику возраста выпуска. Для другого профиля запустите `migrate-profile.ps1 -ProfileDirectory <absolute-directory>` для предварительного просмотра, затем добавьте `-Apply`, когда будете готовы.
|
|
114
|
+
|
|
115
|
+
В GitHub Release также включён `dsh-computer-use.tgz` для офлайн- или ручной установки; для обновлений через маркетплейс по умолчанию используется установка из реестра.
|
|
116
|
+
|
|
117
|
+
Для пользователей CLI (профиль web):
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
dsh plugin --profile web add dsh-codex-style-computer-use
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Для диагностики Desktop необходимо использовать **CLI, встроенный в официальное приложение Desktop**:
|
|
124
|
+
|
|
125
|
+
```powershell
|
|
126
|
+
$CuDshInstall = Join-Path $env:LOCALAPPDATA 'Programs\DeepSeek Harness'
|
|
127
|
+
& "$CuDshInstall\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop why dsh-codex-style-computer-use
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
При нестандартной установке задайте в `$CuDshInstall` каталог, на который указывает ярлык Desktop. Более старый глобальный `dsh` из npm может отвергнуть профиль desktop. Не добавляйте `resources/runtime/bin` в глобальный PATH и не устанавливайте отдельный pnpm для этой задачи. Для установки по-прежнему предпочтителен интерфейс плагина.
|
|
131
|
+
|
|
132
|
+
## Встроенный skill
|
|
133
|
+
|
|
134
|
+
Инструменты управления остаются заблокированными, пока сессия не выдаст фразу-подтверждение, которая есть только в `skills/computer-use/SKILL.md`. Это сделано намеренно — такова самая честная и строгая реализация принципа «сначала прочитайте руководство, потом управляйте», потому что ни один слой инструментов не может увидеть, прочитала ли модель документ.
|
|
135
|
+
|
|
136
|
+
Плагин регистрирует встроенный skill через `ctx.skills.register()`, когда этот сервис доступен. Если сервиса нет, `computer_use_activate` возвращает то же руководство, абсолютный путь к его исходному файлу и список инструментов в области действия. Требование фразы-подтверждения и все существующие проверки подтверждений и тормоза по-прежнему действуют.
|
|
137
|
+
|
|
138
|
+
## Совместный ввод в 1.2.0-rc.2
|
|
139
|
+
|
|
140
|
+
Этот предварительный выпуск вводит немедленный перехват управления человеком, автоматическое ожидание после 2 секунд продолжающегося ввода и возобновление после 3 секунд тишины. Ожидание происходит локально, без опроса модели. Прерванные записи требуют нового чтения фактического результата и никогда не воспроизводятся слепо. Отмена на стороне хоста освобождает принятый автоматизацией ввод, не создавая новой постоянной паузы. Существующая обработка главного окна DSH Pet и восстановления исходного положения поверх остальных окон сохраняется.
|
|
141
|
+
|
|
142
|
+
Настроенные маршруты GLM 5.3 Max, GLM 5.3 Flash и DeepSeek Flash прошли контролируемый тест протокола продолжения. Нативный ввод и физические горячие клавиши проверялись отдельно; это не общий бенчмарк рабочего стола или компьютерного зрения. Область проверки описана в [проверке выпуска](docs/RELEASE-1.2.0-rc.2.md).
|
|
143
|
+
|
|
144
|
+
## Управление по требованию в 1.1
|
|
145
|
+
|
|
146
|
+
- **Инструменты для каждого Агента:** бездействующие Агенты видят `computer_use_activate`, `computer_ctrl` и `computer_ask`. Успешная загрузка skill computer-use, получение фразы-подтверждения или активация открывают этому Агенту 19 инструментов рабочего стола вместе с точкой входа активации. Другие Агенты и дочерние Агенты активируются независимо. Поддерживаются нативные вызовы и Node `run_code`. Активация не запускает управление и не снимает человеческий тормоз.
|
|
147
|
+
- **Наблюдаемые цели UIA:** запрос по имени/id в ограниченной области возвращает непрозрачный дескриптор цели. Используйте его для действий по шаблонам; явно включаемый `rebind:true` разрешает восстановление по уникальной идентичности или семантике после замены в том же окне. Изменённый контекст, неоднозначность и неполное сканирование приводят к отказу. Широкие запросы пропускают дескрипторы восстановления, если не указан `targets:true`; создание вспомогательных «свидетелей» для большого списка стоит дополнительной нативной работы.
|
|
148
|
+
- **Инкрементальные наблюдения:** передайте идентификатор предыдущего наблюдения как `since` вместе с тем же запросом. Дельты сохраняют добавления, изменения, удаления и порядок. Снимки изолированы по Агентам: не более 64 проиндексированных наблюдений и 4 МиБ сохранённого JSON на хранилище. `snapshot` извлекает сохранённый исторический результат; `offset` и `limit` постранично читают его массивы. Отсутствие базового снимка, изменение области, неполные доказательства или слишком большая дельта приводят к возврату полного вывода.
|
|
149
|
+
|
|
150
|
+
Пределы кэша и границы восстановления описаны в [подробном протоколе](skills/computer-use/references/progressive-control.md). Снимки UIA сохраняют поля, возвращённые провайдером, в пределах существующих ограничений провайдера; извлечение истории не заменяет свежую проверку результата.
|
|
151
|
+
|
|
152
|
+
## Инструменты
|
|
153
|
+
|
|
154
|
+
| Группа | Инструменты |
|
|
155
|
+
|---|---|
|
|
156
|
+
| Активация | `computer_use_activate` |
|
|
157
|
+
| Наблюдение | `computer_state` `computer_shot` `computer_ocr` `computer_marks` `computer_uia` |
|
|
158
|
+
| Действие | `computer_click` `computer_move` `computer_drag` `computer_scroll` `computer_select` `computer_key` `computer_type` `computer_uia_act` `computer_window` `computer_clip` |
|
|
159
|
+
| Поток | `computer_wait` `computer_batch` |
|
|
160
|
+
| Мета | `computer_ask` `computer_ctrl` |
|
|
161
|
+
|
|
162
|
+
`computer_marks` возвращает нумерованные метки для элементов, найденных на экране; `computer_marks {shot:true}` дополнительно сохраняет аннотированное изображение. `computer_shot` возвращает обычный снимок экрана, а на маршрутах с поддержкой изображений — нативное вложение-изображение. Метка — это идентификатор снимка: он сверяется с идентичностью окна
|
|
163
|
+
и выборочно проверенными пикселями до отправки любого ввода, поэтому устаревшая метка отклоняется, а не приводит к клику в неверном месте.
|
|
164
|
+
|
|
165
|
+
## Режимы подтверждения
|
|
166
|
+
|
|
167
|
+
Если хост сообщает об автоматическом отказе при отключённых запросах как «пользователь отклонил инструмент», см. [патч атрибуции подтверждений DSH и регрессионный тест](docs/APPROVAL-ATTRIBUTION.md).
|
|
168
|
+
|
|
169
|
+
`automationMode` задаётся в настройках плагина, значение по умолчанию — `standard`:
|
|
170
|
+
|
|
171
|
+
| Режим | Наблюдение | Действие |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| `read-only` | разрешено | запрещено |
|
|
174
|
+
| `standard` | разрешено | каждое действие запрашивается через карточку подтверждения хоста |
|
|
175
|
+
| `autonomous` | разрешено | разрешено, высокорисковые операции всё равно требуют подтверждения |
|
|
176
|
+
| `unrestricted` | разрешено | разрешено (отказоустойчивость воркера и ограничение частоты по-прежнему действуют) |
|
|
177
|
+
|
|
178
|
+
Высокорисковые операции (закрытие окна, `alt+f4`, `win+r` и подобные) требуют подтверждения в любом режиме. Поля паролей
|
|
179
|
+
определяются через `IsPassword` в UI Automation и по умолчанию отклоняются.
|
|
180
|
+
|
|
181
|
+
## Модель безопасности
|
|
182
|
+
|
|
183
|
+
- **Совместный ввод** — обычная активность пользователя разрешена, пока агент думает, наблюдает или готовится. Во время фактического воздействия набор текста, прокрутка и нажатия кнопок немедленно уступают управление; для перемещения указателя допускается смещение до 16 пикселей. Продолжающийся ввод или удержание клавиши/кнопки в течение 2 секунд включает автоматическое ожидание. После отпускания и 3 секунд тишины агент должен проверить текущую цель и продолжить исходную задачу, не воспроизводя слепо частичные записи. Мягкий бледно-жёлтый градиент по краю обозначает, что управление у человека.
|
|
184
|
+
- **Ручная пауза** — только физическая комбинация `Ctrl+Esc` включает постоянный тормоз ввода; `Ctrl+Alt+R` возобновляет работу. Обычный Esc, набор текста, прокрутка, расстояние и частота перемещения указателя и угол экрана такую паузу не создают. Явные остановки для вопроса и диагностики остаются отдельными.
|
|
185
|
+
- **Выход** — `Ctrl+Alt+Q` завершает сессию: оверлей исчезает, его обработчики снимаются, а дальнейшее
|
|
186
|
+
воздействие отклоняется до тех пор, пока в одном из следующих шагов не будет открыто новое.
|
|
187
|
+
- **Тормоз — это факт о машине, а не об одном процессе** — включённое состояние сохраняется,
|
|
188
|
+
и каждый воркер его принимает, включая запущенный позже из оболочки.
|
|
189
|
+
- **Аудит** — каждое воздействие добавляется в `$DSH_HOME/data/computer-use/audit.jsonl` с
|
|
190
|
+
очисткой аргументов.
|
|
191
|
+
- **Аварийный выключатель самого плагина** — при `DSH_COMPUTER_USE_KILL=1` плагин отказывается запускаться;
|
|
192
|
+
`dryRun: true` только имитирует воздействия и записывает их в журнал.
|
|
193
|
+
|
|
194
|
+
## Конфигурация
|
|
195
|
+
|
|
196
|
+
| Ключ | По умолчанию | Значение |
|
|
197
|
+
|---|---:|---|
|
|
198
|
+
| `automationMode` | `standard` | режим подтверждения (см. выше) |
|
|
199
|
+
| `progressiveTools` | `true` | активация по Агентам; `false` — 19 инструментов рабочего стола доступны глобально |
|
|
200
|
+
| `actionFeedback` | `true` | автоматически наблюдать после прямых действий и пакетов |
|
|
201
|
+
| `actionFeedbackDetail` | `compact` | `compact`, `full` или `none`; `feedback` в вызове переопределяет это значение; незакэшированные доказательства возвращаются полностью прямо в ответе |
|
|
202
|
+
| `dryRun` | `false` | имитировать воздействия, только записывать в журнал |
|
|
203
|
+
| `maxActionsPerMinute` | `60` | ограничение частоты воздействий на уровне ядра |
|
|
204
|
+
| `annotateMarks` | `true` | рисовать рамки Set-of-Marks на снимках экрана |
|
|
205
|
+
| `workerExe` | `""` | явный путь к воркеру; пусто = автопоиск или компиляция |
|
|
206
|
+
| `snapshotDir` | `""` | каталог снимков экрана; пусто = `$DSH_HOME/data/computer-use/shots` |
|
|
207
|
+
|
|
208
|
+
## MCP-сервер
|
|
209
|
+
|
|
210
|
+
`mcp/` — MCP-сервер stdio без зависимостей поверх того же ядра, для клиентов, которые говорят на MCP, а не на Cordis:
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
# published package (2.0.1 and later) — no checkout needed
|
|
214
|
+
npx -y dsh-codex-style-computer-use
|
|
215
|
+
|
|
216
|
+
# from a checkout
|
|
217
|
+
node mcp/src/index.js
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Встроенный сервер сообщает версию этого корневого пакета. Он запускается в режиме только наблюдения.
|
|
221
|
+
Запускающий его хост может установить `DSH_CU_ALLOW_INPUT=1`, когда он владеет авторизацией на действия с рабочим столом;
|
|
222
|
+
вызовы инструментов MCP не могут включить ввод. Инструмент совместимости `cu_approve` лишь сообщает это правило и
|
|
223
|
+
никогда не даёт согласия. Политика `automationMode` в DSH принадлежит адаптеру Cordis и не является
|
|
224
|
+
службой подтверждений MCP. `DSH_CU_DRY_RUN=1` имитирует ввод, который хост уже разрешил.
|
|
225
|
+
|
|
226
|
+
Оба адаптера используют одну и ту же грамматику клавишных команд, правила отказа пакета и продолжения,
|
|
227
|
+
а также отображение координат изображения. MCP возвращает структурированные метаданные захвата и одно последнее изображение PNG/JPEG, без
|
|
228
|
+
сериализации байтов изображения в текст JSON. `cu_hold` / `cu_free` резервируют или освобождают сцену между
|
|
229
|
+
действиями; `cu_release` завершает цикл работы с рабочим столом. `cu_drag` принимает проверки `expectCursor` и `hwnd`.
|
|
230
|
+
MCP предоставляет меньший набор инструментов; интеграция человеческих вопросов и жизненного цикла хоста,
|
|
231
|
+
специфичная для DSH, обеспечивается адаптером Cordis.
|
|
232
|
+
|
|
233
|
+
## Разработка
|
|
234
|
+
|
|
235
|
+
Проверки выпуска публикатора по умолчанию используют официальный реестр npm. Если этот источник недоступен в вашей сети, `CU_REGISTRY` выбирает явное зеркало для команды `check`, работающей только на чтение; результат в JSON содержит `registry` и `authoritative`. Пример в PowerShell (влияет только на текущую оболочку):
|
|
236
|
+
|
|
237
|
+
```powershell
|
|
238
|
+
$env:CU_REGISTRY = 'https://registry.npmmirror.com'
|
|
239
|
+
node scripts/release-channel.mjs check 1.2.0
|
|
240
|
+
Remove-Item Env:CU_REGISTRY
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Код выхода `0` означает, что версия прошла 24-часовую проверку публикатора, `2` — что она всё ещё «остывает», а `1` — что проверка не удалась. Сетевая ошибка не доказывает, что пакет не опубликован, а зеркала могут отставать. `promote` всегда перепроверяет и записывает `https://registry.npmjs.org`, игнорируя `CU_REGISTRY`; для этого нужен доступ к этому источнику, при необходимости через прокси-конфигурацию npm. Этот инструмент публикатора не входит в установку для конечных пользователей. См. [процедуру выпуска](docs/RELEASE-1.2.0.md).
|
|
244
|
+
|
|
245
|
+
Репозиторий поставляет набор защитных проверок, которые охраняют перечисленные инварианты — время жизни цикла,
|
|
246
|
+
протокол «вопрос/тормоз», классификацию операций, шлюз skill и подключение встроенного skill:
|
|
247
|
+
|
|
248
|
+
```sh
|
|
249
|
+
pwsh -NoProfile -ExecutionPolicy Bypass -File build/run-guards.ps1 # all guards
|
|
250
|
+
node build/verify-tools-schema.mjs # tool-schema load guard
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Определения инструментов компилируются через настоящий DSL `@deepseek-ai/dsh-tools`, поэтому ошибка в схеме обнаруживается
|
|
254
|
+
здесь, а не роняет дерево плагинов хоста при перезапуске. Некоторые проверки компилируют нативный
|
|
255
|
+
воркер и работают только в Windows.
|
|
256
|
+
|
|
257
|
+
## Лицензия
|
|
258
|
+
|
|
259
|
+
MIT — см. [LICENSE](LICENSE).
|
package/README.zh.md
CHANGED
|
@@ -1,25 +1,50 @@
|
|
|
1
1
|
# Codex 风格 Computer Use
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**全市场最精准的 Windows 桌面操控,也是单个任务成本最低的。**
|
|
4
4
|
|
|
5
|
-
你描述目标,AI
|
|
5
|
+
你描述目标,AI 读准控件身份、按真实控件执行、回读结果——一段已知流程一轮模型往返就跑完,而不是每个动作各花一轮。
|
|
6
6
|
|
|
7
|
-
[English](README.md) | 中文 · [安装](#在-dsh-market-安装和更新) · [版本记录](CHANGELOG.md)
|
|
7
|
+
[English](README.md) | 中文 | [Français](README.fr.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Português](README.pt.md) | [العربية](README.ar.md) | [Русский](README.ru.md) | [فارسی](README.fa.md) · [安装](#在-dsh-market-安装和更新) · [版本记录](CHANGELOG.md) · [2.0.0 变更](docs/RELEASE-2.0.0.md)
|
|
8
8
|
|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
11
|
+
## 为什么它更准
|
|
12
|
+
|
|
13
|
+
- **认身份,不猜坐标。** UI Automation 给出真实控件树与精确 `AutomationId`,动作可以走控件自身的 UI Automation 模式,而不是盲点坐标。
|
|
14
|
+
- **标记先校验,再执行。** 默认情况下,编号标记在派发输入前按窗口身份与采样像素校验,过期标记会被拒绝,不会点错位置。动画邻居导致像素签名失效时,`uiaOnly` 用窗口句柄与几何固定身份,派发时的遮挡检查仍然生效。
|
|
15
|
+
- **查询有边界。** UIA 查询默认深度 6、120 节点、1200 毫秒软预算;深度超过 6 或节点超过 300 时必须提供已测量的 `anchor`,不会悄悄扫错区域。
|
|
16
|
+
- **看不见就读字。** `computer_ocr` 返回绝对屏幕像素的行与词框,零 UIA 应用也能按名字定位。
|
|
17
|
+
|
|
18
|
+
## 为什么它更省
|
|
19
|
+
|
|
20
|
+
- **一段已知流程只花一轮往返。** 一次 `computer_batch` 串行执行整串动作、遇错即停,只花一轮模型往返,而不是每个动作各花一轮。
|
|
21
|
+
- **只回增量。** 把上一次观察 ID 作为 `since` 传回,只拿到新增、变化、删除与顺序,而不是整棵树重发。
|
|
22
|
+
- **2.0.0 默认精简回执。** 动作后的文字回执通常最多再加 6 KiB;需要细节时仍可用 `feedback: full`。
|
|
23
|
+
- **证据不进对话。** 完整点查证据可留在有界本地缓存(内存 4 MiB、磁盘 32 MiB、64 条、24 小时过期),按需读取。
|
|
24
|
+
- **本地的事留在本地。** UIA、屏幕 OCR 与像素校验都在预置原生 worker 里完成,不额外产生每一步的视觉账单。
|
|
25
|
+
|
|
26
|
+
## 它不会抢走你的桌面
|
|
27
|
+
|
|
28
|
+
- **会等你。** 操作前 1 秒提示(3 分钟内再次操作 0.1 秒)后即时交出桌面;你操作完,AI 重新观察并续接原任务。
|
|
29
|
+
- **刹车能传进模型。** `Ctrl+Esc` 暂停、`Ctrl+Alt+R` 恢复、`Ctrl+Alt+Q` 退出,停止事件被推入正在运行的会话。默认保留操作审批,密码框默认拒绝。
|
|
30
|
+
- **做不到的会说出来。** 检测到 Windows 安全桌面(UAC 或锁屏)会报告并在结束后自动续接,而不是盲目重试。
|
|
14
31
|
|
|
15
32
|

|
|
16
33
|
|
|
17
34
|

|
|
18
35
|
|
|
19
|
-
上图为
|
|
36
|
+
上图为 1.3.0 引入的交互模型;2.0.0 的风筝光标、有界查询与精简回执见上。实际 Token 用量取决于任务、模型和观察方式。默认保留操作审批;明确暂停、取消和退出始终有效。
|
|
20
37
|
|
|
21
38
|
**安装即用。** 19 个桌面工具,原生组件随包提供,无需 SDK 或安装时编译。支持 Windows、Node.js ≥ 22 和系统自带的 .NET Framework 4.x。独立社区插件;Codex 用于说明交互风格。
|
|
22
39
|
|
|
40
|
+
## 2.0.0 新特性
|
|
41
|
+
|
|
42
|
+
- **默认精简回执**——动作后的文字回执通常最多再加 6 KiB;需要细节可用 `feedback: full`,不需要可用 `feedback: none`。
|
|
43
|
+
- **有界、带锚点的 UIA 查询**——默认深度 6、120 节点、1200 毫秒软预算;深度超过 6 或节点超过 300 的查询必须提供已测量的 `anchor`。
|
|
44
|
+
- **证据按需读取**——内存 4 MiB + 磁盘 32 MiB、64 条记录、24 小时过期;磁盘失败回退到有界内存。
|
|
45
|
+
- **自适应操作预告**——首次 1 秒,3 分钟滚动窗口内再次操作 0.1 秒;倾斜的风筝标记点击点。
|
|
46
|
+
- **加固的输入路径**——窗口管理快捷键守卫、worker 背压/恢复、过期目标检查与取消清理。
|
|
47
|
+
|
|
23
48
|
<details>
|
|
24
49
|
<summary>当前版本与兼容性</summary>
|
|
25
50
|
|
|
@@ -54,7 +79,7 @@
|
|
|
54
79
|
|
|
55
80
|
在市场搜索 **computer-use** 或 **Codex-style**,认准仓库 **ltmroberthk915/dsh-computer-use**、npm 包 **dsh-codex-style-computer-use**(维护者 **ltmroberthk**),点击**安装**。以后通过市场的**更新**或**全部更新**获取正式频道版本。两份原生组件都已随包提供,无需 PowerShell 7、SDK 或构建白名单。
|
|
56
81
|
|
|
57
|
-
也可在 **设置 → 插件 → 添加插件** 输入 **`dsh-codex-style-computer-use
|
|
82
|
+
也可在 **设置 → 插件 → 添加插件** 输入 **`dsh-codex-style-computer-use`**,安装当前正式频道;要体验本页描述的 2.0.0,输入 **`dsh-codex-style-computer-use@2.0.0`**。这里填 npm 包名即可。宿主可能对新版本设置等待期,以界面提示为准。首次新增 bundle 可在支持的宿主中热加载;确认工具与 skill 已出现即可使用。替换已经加载的版本、客户端界面未刷新或界面提示 **restart-required / 需要重启** 时,从托盘完整退出 DSH 并重新打开。
|
|
58
83
|
|
|
59
84
|
### 发布未满 24 小时
|
|
60
85
|
|
|
@@ -176,6 +201,10 @@ ID**:派发输入前会核对窗口身份与采样像素,因此过期的 mar
|
|
|
176
201
|
`mcp/` 是建立在同一核心之上的零依赖 MCP stdio 服务,供只讲 MCP、不讲 Cordis 的客户端使用:
|
|
177
202
|
|
|
178
203
|
```sh
|
|
204
|
+
# 已发布包(2.0.1 起可用),无需克隆仓库
|
|
205
|
+
npx -y dsh-codex-style-computer-use
|
|
206
|
+
|
|
207
|
+
# 从仓库检出运行
|
|
179
208
|
node mcp/src/index.js
|
|
180
209
|
```
|
|
181
210
|
|
|
@@ -212,6 +241,10 @@ node build/verify-tools-schema.mjs # 工具 sc
|
|
|
212
241
|
工具定义走真实的 `@deepseek-ai/dsh-tools` DSL 编译,因此 schema 写错会在这里失败,
|
|
213
242
|
而不是在宿主重启时把整棵插件树带崩。部分守卫会编译原生 worker,仅 Windows 可跑。
|
|
214
243
|
|
|
244
|
+
发版前先跑 `npm run verify:package`:它校验打包身份、预编译 helper 的哈希,以及每一个 `bin`
|
|
245
|
+
条目(目标文件存在、带 node shebang)。它刻意不是发布钩子——本包不带任何生命周期脚本——
|
|
246
|
+
所以请在 `npm publish` 之前自己手动执行一次。
|
|
247
|
+
|
|
215
248
|
## 许可
|
|
216
249
|
|
|
217
250
|
MIT —— 见 [LICENSE](LICENSE)。
|
package/icon.svg
CHANGED
|
@@ -13,10 +13,14 @@
|
|
|
13
13
|
<stop offset=".5" stop-color="#38BDF8"/>
|
|
14
14
|
<stop offset="1" stop-color="#A78BFA"/>
|
|
15
15
|
</linearGradient>
|
|
16
|
-
<radialGradient id="glow" cx="
|
|
17
|
-
<stop stop-color="#38BDF8" stop-opacity=".
|
|
16
|
+
<radialGradient id="glow" cx="17.4" cy="16.8" r="7.4" gradientUnits="userSpaceOnUse">
|
|
17
|
+
<stop stop-color="#38BDF8" stop-opacity=".30"/>
|
|
18
18
|
<stop offset="1" stop-color="#38BDF8" stop-opacity="0"/>
|
|
19
19
|
</radialGradient>
|
|
20
|
+
<linearGradient id="kite" x1="14.1" y1="10.6" x2="19.9" y2="23.0" gradientUnits="userSpaceOnUse">
|
|
21
|
+
<stop stop-color="#55ADFF"/>
|
|
22
|
+
<stop offset="1" stop-color="#163A99"/>
|
|
23
|
+
</linearGradient>
|
|
20
24
|
</defs>
|
|
21
25
|
<rect width="32" height="32" rx="7.5" fill="url(#tile)"/>
|
|
22
26
|
<rect width="32" height="32" rx="7.5" fill="url(#halo)"/>
|
|
@@ -24,6 +28,18 @@
|
|
|
24
28
|
<path d="M5.6 10.1 H26.4" stroke="url(#rail)" stroke-width="1.05" stroke-opacity=".5"/>
|
|
25
29
|
<circle cx="8.5" cy="8" r=".9" fill="#5EEAD4"/>
|
|
26
30
|
<circle cx="11.2" cy="8" r=".9" fill="#A78BFA" fill-opacity=".85"/>
|
|
27
|
-
<circle cx="
|
|
28
|
-
|
|
31
|
+
<circle cx="17.4" cy="16.8" r="7.4" fill="url(#glow)"/>
|
|
32
|
+
|
|
33
|
+
<!-- mouse-line tail of the agent kite pointer -->
|
|
34
|
+
<path d="M19.87 22.96 C 19.2 25.3, 16.4 24.1, 14.6 26.3" stroke="#3B82F6" stroke-opacity=".92" stroke-width=".74" stroke-linecap="round" fill="none"/>
|
|
35
|
+
|
|
36
|
+
<!-- tilted kite pointer, simplified from the runtime KitePointerPainter -->
|
|
37
|
+
<polygon points="14.13,10.64 22.07,14.43 19.87,22.96 11.93,19.17"
|
|
38
|
+
fill="none" stroke="#3684FF" stroke-opacity=".35" stroke-width="1.5" stroke-linejoin="round"/>
|
|
39
|
+
<polygon points="14.13,10.64 22.07,14.43 19.87,22.96 11.93,19.17" fill="url(#kite)"/>
|
|
40
|
+
<polygon points="14.13,10.64 22.07,14.43 17.00,16.80" fill="#A9E0FF" fill-opacity=".30"/>
|
|
41
|
+
<polygon points="17.00,16.80 22.07,14.43 19.87,22.96" fill="#06184F" fill-opacity=".28"/>
|
|
42
|
+
<polygon points="14.13,10.64 22.07,14.43 19.87,22.96 11.93,19.17"
|
|
43
|
+
fill="none" stroke="#CFEFFF" stroke-opacity=".95" stroke-width=".33" stroke-linejoin="round"/>
|
|
44
|
+
<line x1="14.13" y1="10.64" x2="19.87" y2="22.96" stroke="#D5F2FF" stroke-opacity=".30" stroke-width=".25"/>
|
|
29
45
|
</svg>
|
|
Binary file
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
"platform": "win32",
|
|
4
4
|
"architecture": "x64",
|
|
5
5
|
"sourceSha256": "6e17308fc1cb0de1ece6f3164866b6de03ecdf74a42a6e78c0a8e6d02912c3bf",
|
|
6
|
-
"binarySha256": "
|
|
6
|
+
"binarySha256": "ad99b350925f8b373a93b80ee73b2632d23f8f6e8bab913a2a83becfa7b016af"
|
|
7
7
|
}
|
|
Binary file
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"format": 1,
|
|
3
3
|
"platform": "win32",
|
|
4
4
|
"architecture": "x64",
|
|
5
|
-
"sourceSha256": "
|
|
6
|
-
"binarySha256": "
|
|
5
|
+
"sourceSha256": "b448b6a665147bde3698471c0a36897188fd26688338a919b45ac2d96b175a95",
|
|
6
|
+
"binarySha256": "f8042acb806f07240ee5ba70eda3b235fc8f7e668318cc44e29b889a82b0b647"
|
|
7
7
|
}
|
package/lib/core/index.js
CHANGED
|
@@ -719,6 +719,11 @@ export class ComputerUse extends EventEmitter {
|
|
|
719
719
|
x: pt.x, y: pt.y, button: opts.button || 'left', clicks: opts.clicks || 1,
|
|
720
720
|
settleMs: opts.settleMs ?? 40,
|
|
721
721
|
...(witness ? { verificationRegion: witness } : {}),
|
|
722
|
+
// Embedded renderers (a WeChat article panel, an Electron child) belong to a DIFFERENT
|
|
723
|
+
// process than the window that hosts them, so the occlusion check reads them as "covered"
|
|
724
|
+
// even though the pixel is inside the app the caller activated. The worker already
|
|
725
|
+
// implements the escape hatch; forward it, or a whole class of real apps is unclickable.
|
|
726
|
+
...(opts.allowCovered ? { allowCovered: true } : {}),
|
|
722
727
|
...((pt.expectHwnd || opts.expectHwnd) ? { expectHwnd: pt.expectHwnd || opts.expectHwnd } : {}),
|
|
723
728
|
})
|
|
724
729
|
}
|
|
@@ -1031,6 +1036,32 @@ export class ComputerUse extends EventEmitter {
|
|
|
1031
1036
|
async ocr (region) { return this.call('ocr', region ? { ...region } : {}) }
|
|
1032
1037
|
async clipWrite (text) { return this.actuate('clipWrite', { text }) }
|
|
1033
1038
|
|
|
1039
|
+
/** Open an app/URL/folder/document through ShellExecute, as a real actuation: the halo,
|
|
1040
|
+
* the brake checks, the audit trail and the rate window all come from actuate() — which
|
|
1041
|
+
* is exactly why this is an op and not a Node-side spawn (see worker.cs Launch). */
|
|
1042
|
+
async launch (target, opts = {}) {
|
|
1043
|
+
// `args` is an ARRAY of argument values (quoted once, in the worker). Passing a ready-made
|
|
1044
|
+
// command line would make the launcher parse our boundaries differently than the caller meant.
|
|
1045
|
+
return this.actuate('launch', {
|
|
1046
|
+
target,
|
|
1047
|
+
...(opts.args !== undefined ? { args: opts.args } : {}),
|
|
1048
|
+
...(opts.tailMs !== undefined ? { tailMs: opts.tailMs } : {}),
|
|
1049
|
+
})
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
/** Put keyboard focus on a FIELD and prove it: clicks (x,y), then reports the UIA focused
|
|
1053
|
+
* element and whether a caret is provable there (OS caret, else a two-frame blink check).
|
|
1054
|
+
* Refuse to type when `verified` is false — typing follows the focused control, not the
|
|
1055
|
+
* window, and a document that kept focus silently swallows the text. */
|
|
1056
|
+
async focusField (opts = {}) {
|
|
1057
|
+
return this.actuate('focusField', {
|
|
1058
|
+
x: opts.x,
|
|
1059
|
+
y: opts.y,
|
|
1060
|
+
...(opts.hwnd !== undefined ? { hwnd: opts.hwnd } : {}),
|
|
1061
|
+
...(opts.verifyCaret !== undefined ? { verifyCaret: opts.verifyCaret } : {}),
|
|
1062
|
+
})
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1034
1065
|
async activateWindow (sel) { return this.actuate('activate', sel) }
|
|
1035
1066
|
async windowOp (sel, op, opts = {}) { return this.actuate('windowOp', { ...sel, op, ...opts }) }
|
|
1036
1067
|
/** Deterministic placement (no mouse): move/resize a window to an arbitrary rect. */
|