ok-script 2.0.22__tar.gz → 3.0.0__tar.gz

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.
Files changed (451) hide show
  1. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-env/SKILL.md +3 -1
  2. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-project/SKILL.md +1 -0
  3. {ok_script-2.0.22 → ok_script-3.0.0}/PKG-INFO +43 -18
  4. {ok_script-2.0.22 → ok_script-3.0.0}/README.md +40 -12
  5. {ok_script-2.0.22 → ok_script-3.0.0}/ok/__init__.py +40 -5
  6. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/events.py +10 -0
  7. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/start_controller.py +25 -0
  8. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/ui_config.py +6 -4
  9. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/windows_graphics.py +6 -3
  10. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/windows_graphics_hdr.py +1 -1
  11. {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/Box.py +10 -25
  12. {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/Feature.py +0 -3
  13. {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/FeatureSet.py +93 -65
  14. {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/TaskExecutor.py +24 -29
  15. {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/task.py +52 -124
  16. {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/TaskTestCase.py +2 -2
  17. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/MainWindow.py +269 -338
  18. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/MessageWindow.py +17 -18
  19. ok_script-3.0.0/ok/ui/qt/about/AboutTab.py +272 -0
  20. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/about/UpdateCard.py +35 -60
  21. ok_script-3.0.0/ok/ui/qt/common/config.py +97 -0
  22. ok_script-3.0.0/ok/ui/qt/debug/diagnosis_page.py +500 -0
  23. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/en_US.qm +0 -0
  24. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/en_US.ts +387 -0
  25. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/es_ES.qm +0 -0
  26. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/es_ES.ts +387 -0
  27. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ja_JP.qm +0 -0
  28. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ja_JP.ts +392 -1
  29. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ko_KR.qm +0 -0
  30. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ko_KR.ts +388 -1
  31. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_CN.qm +0 -0
  32. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_CN.ts +387 -0
  33. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_TW.qm +0 -0
  34. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_TW.ts +387 -0
  35. ok_script-3.0.0/ok/ui/qt/kit/__init__.py +29 -0
  36. ok_script-3.0.0/ok/ui/qt/kit/buttons.py +142 -0
  37. ok_script-3.0.0/ok/ui/qt/kit/cards.py +101 -0
  38. ok_script-3.0.0/ok/ui/qt/kit/dialogs.py +158 -0
  39. ok_script-3.0.0/ok/ui/qt/kit/feedback.py +268 -0
  40. ok_script-3.0.0/ok/ui/qt/kit/gallery.py +279 -0
  41. ok_script-3.0.0/ok/ui/qt/kit/icons.py +366 -0
  42. ok_script-3.0.0/ok/ui/qt/kit/inputs.py +95 -0
  43. ok_script-3.0.0/ok/ui/qt/kit/labels.py +27 -0
  44. ok_script-3.0.0/ok/ui/qt/kit/layout.py +73 -0
  45. ok_script-3.0.0/ok/ui/qt/kit/navigation.py +253 -0
  46. ok_script-3.0.0/ok/ui/qt/kit/options.py +114 -0
  47. ok_script-3.0.0/ok/ui/qt/kit/popover.py +105 -0
  48. ok_script-3.0.0/ok/ui/qt/kit/qss.py +453 -0
  49. ok_script-3.0.0/ok/ui/qt/kit/switch.py +96 -0
  50. ok_script-3.0.0/ok/ui/qt/kit/tabs.py +156 -0
  51. ok_script-3.0.0/ok/ui/qt/kit/theme.py +245 -0
  52. ok_script-3.0.0/ok/ui/qt/kit/window.py +356 -0
  53. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/plugins/PluginTab.py +173 -92
  54. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/plugins/imported_tabs.py +31 -30
  55. ok_script-3.0.0/ok/ui/qt/qt.qrc +10 -0
  56. ok_script-3.0.0/ok/ui/qt/resources.py +20501 -0
  57. ok_script-3.0.0/ok/ui/qt/settings/GlobalConfigTab.py +42 -0
  58. ok_script-3.0.0/ok/ui/qt/settings/config_section.py +53 -0
  59. ok_script-3.0.0/ok/ui/qt/settings/settings_page.py +163 -0
  60. ok_script-3.0.0/ok/ui/qt/shell/__init__.py +1 -0
  61. ok_script-3.0.0/ok/ui/qt/shell/connection.py +299 -0
  62. ok_script-3.0.0/ok/ui/qt/shell/diagnostics.py +138 -0
  63. ok_script-3.0.0/ok/ui/qt/shell/lazy_page.py +32 -0
  64. ok_script-3.0.0/ok/ui/qt/shell/log_page.py +353 -0
  65. ok_script-3.0.0/ok/ui/qt/shell/nav_icons.py +57 -0
  66. ok_script-3.0.0/ok/ui/qt/shell/run_bar.py +361 -0
  67. ok_script-3.0.0/ok/ui/qt/tasks/EditTaskTab.py +1046 -0
  68. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/MarkUpWindow.py +211 -188
  69. ok_script-3.0.0/ok/ui/qt/tasks/ModifyListDialog.py +208 -0
  70. ok_script-3.0.0/ok/ui/qt/tasks/ScheduleTaskTab.py +851 -0
  71. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TemplateFactory.py +46 -41
  72. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TemplateTab.py +152 -170
  73. ok_script-3.0.0/ok/ui/qt/tasks/config_editors.py +397 -0
  74. ok_script-2.0.22/ok/ui/qt/tasks/ConfigCard.py → ok_script-3.0.0/ok/ui/qt/tasks/config_form.py +65 -54
  75. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndLineEdit.py → ok_script-3.0.0/ok/ui/qt/tasks/mouse_buttons.py +0 -41
  76. ok_script-3.0.0/ok/ui/qt/tasks/tasks_page.py +928 -0
  77. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/app.py +36 -43
  78. ok_script-3.0.0/ok/ui/qt/widget/Card.py +50 -0
  79. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/CustomTab.py +10 -6
  80. ok_script-3.0.0/ok/ui/qt/widget/ImportWarningDialog.py +46 -0
  81. ok_script-3.0.0/ok/ui/qt/widget/StartLoadingDialog.py +89 -0
  82. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/Tab.py +18 -20
  83. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/PKG-INFO +43 -18
  84. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/SOURCES.txt +40 -75
  85. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/requires.txt +1 -4
  86. {ok_script-2.0.22 → ok_script-3.0.0}/pyproject.toml +3 -9
  87. ok_script-3.0.0/tests/test_diagnosis_page.py +133 -0
  88. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_global_config.py +18 -15
  89. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_headless_imports.py +22 -0
  90. ok_script-3.0.0/tests/test_kit.py +481 -0
  91. ok_script-3.0.0/tests/test_lazy_page.py +47 -0
  92. ok_script-3.0.0/tests/test_log_page.py +153 -0
  93. ok_script-3.0.0/tests/test_main_window_notifications.py +76 -0
  94. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_main_window_startup_tab.py +18 -40
  95. ok_script-3.0.0/tests/test_main_window_system_theme.py +64 -0
  96. ok_script-3.0.0/tests/test_markup_window.py +94 -0
  97. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_setting.py +5 -5
  98. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mouse_buttons.py +3 -3
  99. ok_script-3.0.0/tests/test_navigation_state.py +63 -0
  100. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_plugin_staging.py +2 -3
  101. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_plugin_tabs.py +19 -20
  102. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_pyappify_startup_update.py +28 -42
  103. ok_script-3.0.0/tests/test_qt_page_layout.py +50 -0
  104. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_schedule_startup.py +62 -3
  105. ok_script-3.0.0/tests/test_settings_page.py +108 -0
  106. ok_script-3.0.0/tests/test_shell.py +347 -0
  107. ok_script-3.0.0/tests/test_tasks_page.py +493 -0
  108. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_template_tab.py +5 -5
  109. ok_script-2.0.22/ok/ui/qt/TabTitles.py +0 -57
  110. ok_script-2.0.22/ok/ui/qt/about/AboutTab.py +0 -112
  111. ok_script-2.0.22/ok/ui/qt/about/HttpTextEdit.py +0 -23
  112. ok_script-2.0.22/ok/ui/qt/about/LinksBar.py +0 -82
  113. ok_script-2.0.22/ok/ui/qt/about/ProjectCard.py +0 -42
  114. ok_script-2.0.22/ok/ui/qt/about/VersionCard.py +0 -20
  115. ok_script-2.0.22/ok/ui/qt/common/OKIcon.py +0 -15
  116. ok_script-2.0.22/ok/ui/qt/common/accent_color.py +0 -28
  117. ok_script-2.0.22/ok/ui/qt/common/config.py +0 -66
  118. ok_script-2.0.22/ok/ui/qt/common/design_system.py +0 -69
  119. ok_script-2.0.22/ok/ui/qt/common/icons.py +0 -20
  120. ok_script-2.0.22/ok/ui/qt/common/style_sheet.py +0 -19
  121. ok_script-2.0.22/ok/ui/qt/debug/DebugTab.py +0 -295
  122. ok_script-2.0.22/ok/ui/qt/debug/JobControls.py +0 -128
  123. ok_script-2.0.22/ok/ui/qt/debug/RunCodeTab.py +0 -112
  124. ok_script-2.0.22/ok/ui/qt/qss/dark/card.qss +0 -16
  125. ok_script-2.0.22/ok/ui/qt/qss/dark/discord.svg +0 -10
  126. ok_script-2.0.22/ok/ui/qt/qss/dark/heart.svg +0 -7
  127. ok_script-2.0.22/ok/ui/qt/qss/dark/message_window.qss +0 -27
  128. ok_script-2.0.22/ok/ui/qt/qss/dark/setting_interface.qss +0 -18
  129. ok_script-2.0.22/ok/ui/qt/qss/dark/status_bar.qss +0 -23
  130. ok_script-2.0.22/ok/ui/qt/qss/dark/stop.svg +0 -9
  131. ok_script-2.0.22/ok/ui/qt/qss/dark/tab.qss +0 -91
  132. ok_script-2.0.22/ok/ui/qt/qss/light/card.qss +0 -15
  133. ok_script-2.0.22/ok/ui/qt/qss/light/discord.svg +0 -10
  134. ok_script-2.0.22/ok/ui/qt/qss/light/heart.svg +0 -7
  135. ok_script-2.0.22/ok/ui/qt/qss/light/message_window.qss +0 -23
  136. ok_script-2.0.22/ok/ui/qt/qss/light/setting_interface.qss +0 -15
  137. ok_script-2.0.22/ok/ui/qt/qss/light/status_bar.qss +0 -20
  138. ok_script-2.0.22/ok/ui/qt/qss/light/stop.svg +0 -9
  139. ok_script-2.0.22/ok/ui/qt/qss/light/tab.qss +0 -85
  140. ok_script-2.0.22/ok/ui/qt/qt.qrc +0 -25
  141. ok_script-2.0.22/ok/ui/qt/resources.py +0 -19088
  142. ok_script-2.0.22/ok/ui/qt/settings/GlobalConfigCard.py +0 -17
  143. ok_script-2.0.22/ok/ui/qt/settings/GlobalConfigTab.py +0 -47
  144. ok_script-2.0.22/ok/ui/qt/settings/SettingTab.py +0 -90
  145. ok_script-2.0.22/ok/ui/qt/start/LogWindow.py +0 -522
  146. ok_script-2.0.22/ok/ui/qt/start/SelectCaptureListView.py +0 -79
  147. ok_script-2.0.22/ok/ui/qt/start/SelectInteractionListView.py +0 -68
  148. ok_script-2.0.22/ok/ui/qt/start/StartCard.py +0 -146
  149. ok_script-2.0.22/ok/ui/qt/start/StartTab.py +0 -395
  150. ok_script-2.0.22/ok/ui/qt/tasks/ConfigItemFactory.py +0 -74
  151. ok_script-2.0.22/ok/ui/qt/tasks/ConfigLabelAndWidget.py +0 -15
  152. ok_script-2.0.22/ok/ui/qt/tasks/EditTaskTab.py +0 -1092
  153. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndButtons.py +0 -44
  154. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndDoubleSpinBox.py +0 -22
  155. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndDropDown.py +0 -45
  156. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndFileSelector.py +0 -89
  157. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndGlobal.py +0 -21
  158. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndList.py +0 -18
  159. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndMcpServer.py +0 -39
  160. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndMultiSelection.py +0 -133
  161. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndSpinBox.py +0 -33
  162. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndSwitchButton.py +0 -24
  163. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndTextEdit.py +0 -42
  164. ok_script-2.0.22/ok/ui/qt/tasks/LabelAndWidget.py +0 -41
  165. ok_script-2.0.22/ok/ui/qt/tasks/ModifyListDialog.py +0 -249
  166. ok_script-2.0.22/ok/ui/qt/tasks/ModifyListItem.py +0 -55
  167. ok_script-2.0.22/ok/ui/qt/tasks/OneTimeTaskTab.py +0 -93
  168. ok_script-2.0.22/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -1310
  169. ok_script-2.0.22/ok/ui/qt/tasks/StartButton.py +0 -51
  170. ok_script-2.0.22/ok/ui/qt/tasks/TaskCard.py +0 -230
  171. ok_script-2.0.22/ok/ui/qt/tasks/TaskTab.py +0 -127
  172. ok_script-2.0.22/ok/ui/qt/tasks/TooltipTableWidget.py +0 -23
  173. ok_script-2.0.22/ok/ui/qt/tasks/TriggerTaskTab.py +0 -32
  174. ok_script-2.0.22/ok/ui/qt/widget/BaseLoading.py +0 -18
  175. ok_script-2.0.22/ok/ui/qt/widget/BaseWindow.py +0 -88
  176. ok_script-2.0.22/ok/ui/qt/widget/Card.py +0 -72
  177. ok_script-2.0.22/ok/ui/qt/widget/EmptyCard.py +0 -14
  178. ok_script-2.0.22/ok/ui/qt/widget/ExpandCardLayout.py +0 -29
  179. ok_script-2.0.22/ok/ui/qt/widget/FramelessDialog.py +0 -13
  180. ok_script-2.0.22/ok/ui/qt/widget/ImportWarningDialog.py +0 -40
  181. ok_script-2.0.22/ok/ui/qt/widget/OkCompactSpinBox.py +0 -10
  182. ok_script-2.0.22/ok/ui/qt/widget/StartLoadingDialog.py +0 -71
  183. ok_script-2.0.22/ok/ui/qt/widget/StatusBar.py +0 -131
  184. ok_script-2.0.22/ok/ui/qt/widget/WidgetWithVLabel.py +0 -17
  185. ok_script-2.0.22/ok/update/__init__.py +0 -0
  186. ok_script-2.0.22/tests/test_accent_color.py +0 -41
  187. ok_script-2.0.22/tests/test_config_card.py +0 -160
  188. ok_script-2.0.22/tests/test_debug_job_controls.py +0 -255
  189. ok_script-2.0.22/tests/test_expand_card_layout.py +0 -69
  190. ok_script-2.0.22/tests/test_main_window_notifications.py +0 -76
  191. ok_script-2.0.22/tests/test_main_window_system_theme.py +0 -124
  192. ok_script-2.0.22/tests/test_navigation_state.py +0 -45
  193. ok_script-2.0.22/tests/test_qt_legacy_imports.py +0 -12
  194. ok_script-2.0.22/tests/test_qt_page_layout.py +0 -45
  195. ok_script-2.0.22/tests/test_start_tab_overlay.py +0 -17
  196. ok_script-2.0.22/tests/test_task_ui.py +0 -207
  197. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/develop/SKILL.md +0 -0
  198. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/develop/agents/openai.yaml +0 -0
  199. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/develop/references/windows-input.md +0 -0
  200. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/generate-templates/SKILL.md +0 -0
  201. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/reload-tasks/SKILL.md +0 -0
  202. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/reload-tasks/agents/openai.yaml +0 -0
  203. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-env/agents/openai.yaml +0 -0
  204. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-env/assets/ok-script-develop/SKILL.md +0 -0
  205. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-project/agents/openai.yaml +0 -0
  206. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/use_venv/SKILL.md +0 -0
  207. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/write-test/SKILL.md +0 -0
  208. {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/write-test/agents/openai.yaml +0 -0
  209. {ok_script-2.0.22 → ok_script-3.0.0}/LICENSE.txt +0 -0
  210. {ok_script-2.0.22 → ok_script-3.0.0}/MANIFEST.in +0 -0
  211. {ok_script-2.0.22 → ok_script-3.0.0}/diagnostics/qq_trace.py +0 -0
  212. {ok_script-2.0.22 → ok_script-3.0.0}/docs/agent-setup.md +0 -0
  213. {ok_script-2.0.22 → ok_script-3.0.0}/docs/feature-crops.md +0 -0
  214. {ok_script-2.0.22 → ok_script-3.0.0}/docs/mcp.md +0 -0
  215. {ok_script-2.0.22 → ok_script-3.0.0}/examples/mcp_observe.py +0 -0
  216. {ok_script-2.0.22 → ok_script-3.0.0}/ok/__main__.py +0 -0
  217. {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/__init__.py +0 -0
  218. {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/emulator_base.py +0 -0
  219. {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/emulator_windows.py +0 -0
  220. {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/platform_windows.py +0 -0
  221. {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/utils.py +0 -0
  222. {ok_script-2.0.22 → ok_script-3.0.0}/ok/assets/default-icon.png +0 -0
  223. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/__init__.py +0 -0
  224. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/__init__.py +0 -0
  225. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/deep.py +0 -0
  226. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/minitouch.py +0 -0
  227. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/nemu_ipc.py +0 -0
  228. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/nemu_utils.py +0 -0
  229. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/pool.py +0 -0
  230. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/timer.py +0 -0
  231. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/util.py +0 -0
  232. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/windows/__init__.py +0 -0
  233. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/windows/d3d11.py +0 -0
  234. {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/windows/dump.py +0 -0
  235. {ok_script-2.0.22 → ok_script-3.0.0}/ok/cli.py +0 -0
  236. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/__init__.py +0 -0
  237. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/capture_labels.py +0 -0
  238. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/code_runner.py +0 -0
  239. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/config_schema.py +0 -0
  240. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/downloads.py +0 -0
  241. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/icons.py +0 -0
  242. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/mcp_runner.py +0 -0
  243. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/mcp_server.py +0 -0
  244. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/notifications.py +0 -0
  245. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/plugin_staging.py +0 -0
  246. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/plugins.py +0 -0
  247. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/screenshot.py +0 -0
  248. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/script_editing.py +0 -0
  249. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/script_packager.py +0 -0
  250. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/script_templates.py +0 -0
  251. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/skills.py +0 -0
  252. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/task_manager.py +0 -0
  253. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/template_store.py +0 -0
  254. {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/translation.py +0 -0
  255. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/DeviceManager.py +0 -0
  256. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/__init__.py +0 -0
  257. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture.py +0 -0
  258. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/__init__.py +0 -0
  259. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/adb.py +0 -0
  260. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/base.py +0 -0
  261. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/bitblt.py +0 -0
  262. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/bitblt_utils.py +0 -0
  263. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/browser.py +0 -0
  264. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/desktop_duplication.py +0 -0
  265. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/hwnd_window.py +0 -0
  266. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/image.py +0 -0
  267. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/nemu_ipc.py +0 -0
  268. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/types.py +0 -0
  269. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/update.py +0 -0
  270. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction.py +0 -0
  271. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/__init__.py +0 -0
  272. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/adb.py +0 -0
  273. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/base.py +0 -0
  274. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/browser.py +0 -0
  275. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/do_nothing.py +0 -0
  276. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/foreground_post_message.py +0 -0
  277. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/genshin.py +0 -0
  278. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/keys.py +0 -0
  279. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/post_message.py +0 -0
  280. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/pydirect.py +0 -0
  281. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/pynput.py +0 -0
  282. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/swipe.py +0 -0
  283. {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/intercation.py +0 -0
  284. {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/__init__.py +0 -0
  285. {ok_script-2.0.22 → ok_script-3.0.0}/ok/gui/__init__.py +0 -0
  286. {ok_script-2.0.22 → ok_script-3.0.0}/ok/gui/util/pyappify_startup.py +0 -0
  287. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/__init__.py +0 -0
  288. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/manager.py +0 -0
  289. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/messenger_images.py +0 -0
  290. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/pipeline.py +0 -0
  291. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/ppocr.py +0 -0
  292. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/providers.py +0 -0
  293. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/system.py +0 -0
  294. {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/windows_messenger.py +0 -0
  295. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ocr/__init__.py +0 -0
  296. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ocr/download_paddle_model.py +0 -0
  297. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
  298. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
  299. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
  300. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
  301. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
  302. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
  303. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
  304. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
  305. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
  306. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Media/__init__.py +0 -0
  307. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
  308. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Security/__init__.py +0 -0
  309. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
  310. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Storage/__init__.py +0 -0
  311. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
  312. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/UI/__init__.py +0 -0
  313. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/__init__.py +0 -0
  314. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/__init__.py +0 -0
  315. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/delegate.py +0 -0
  316. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/export.py +0 -0
  317. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/idldsl.py +0 -0
  318. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/inspectable.py +0 -0
  319. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/roapi.py +0 -0
  320. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/types.py +0 -0
  321. {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/winstring.py +0 -0
  322. {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/DiagnosisTask.py +0 -0
  323. {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/__init__.py +0 -0
  324. {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/exceptions.py +0 -0
  325. {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/OKTestRunner.py +0 -0
  326. {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/RunTests.py +0 -0
  327. {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/__init__.py +0 -0
  328. {ok_script-2.0.22 → ok_script-3.0.0}/ok/third_party/__init__.py +0 -0
  329. {ok_script-2.0.22 → ok_script-3.0.0}/ok/third_party/paperclip.py +0 -0
  330. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/__init__.py +0 -0
  331. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/overlay/__init__.py +0 -0
  332. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/overlay/win32_gdi.py +0 -0
  333. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/Communicate.py +0 -0
  334. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/StartController.py +0 -0
  335. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/__init__.py +0 -0
  336. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/about/__init__.py +0 -0
  337. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/common/__init__.py +0 -0
  338. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/debug/OverlayWidget.py +0 -0
  339. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/debug/Screenshot.py +0 -0
  340. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/debug/__init__.py +0 -0
  341. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/events.py +0 -0
  342. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
  343. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/__init__.py +0 -0
  344. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/path.py +0 -0
  345. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/update.py +0 -0
  346. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
  347. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/overlay/__init__.py +0 -0
  348. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/plugins/__init__.py +0 -0
  349. {ok_script-2.0.22/ok/ui/qt/qss → ok_script-3.0.0/ok/ui/qt/settings}/__init__.py +0 -0
  350. {ok_script-2.0.22/ok/ui/qt/settings → ok_script-3.0.0/ok/ui/qt/start}/__init__.py +0 -0
  351. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
  352. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/RecordScript.py +0 -0
  353. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
  354. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TaskManger.py +0 -0
  355. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
  356. {ok_script-2.0.22/ok/ui/qt/start → ok_script-3.0.0/ok/ui/qt/tasks}/__init__.py +0 -0
  357. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/schedule_index_sync.py +0 -0
  358. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/Alert.py +0 -0
  359. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/InitWorker.py +0 -0
  360. {ok_script-2.0.22/ok/ui/qt/tasks → ok_script-3.0.0/ok/ui/qt/util}/__init__.py +0 -0
  361. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/download.py +0 -0
  362. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/pip_util.py +0 -0
  363. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/pyappify_startup.py +0 -0
  364. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/touch_scroll.py +0 -0
  365. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/windows_thumbnail.py +0 -0
  366. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/FlowLayout.py +0 -0
  367. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/ImageWidget.py +0 -0
  368. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
  369. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
  370. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
  371. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/TabWidget.py +0 -0
  372. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
  373. {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
  374. {ok_script-2.0.22/ok/ui/qt/util → ok_script-3.0.0/ok/ui/qt/widget}/__init__.py +0 -0
  375. {ok_script-2.0.22/ok/ui/qt/widget → ok_script-3.0.0/ok/update}/__init__.py +0 -0
  376. {ok_script-2.0.22 → ok_script-3.0.0}/ok/update/copy_ok_folder.py +0 -0
  377. {ok_script-2.0.22 → ok_script-3.0.0}/ok/update/inline_ok_requirements.py +0 -0
  378. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/Analytics.py +0 -0
  379. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/GlobalConfig.py +0 -0
  380. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/__init__.py +0 -0
  381. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/blur.py +0 -0
  382. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/clazz.py +0 -0
  383. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/collection.py +0 -0
  384. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/color.py +0 -0
  385. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/config.py +0 -0
  386. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/explorer.py +0 -0
  387. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/file.py +0 -0
  388. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/gpu_driver_settings.py +0 -0
  389. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/handler.py +0 -0
  390. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/i18n.py +0 -0
  391. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/logger.py +0 -0
  392. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/partial_sync_repo.py +0 -0
  393. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/print_hwnd.py +0 -0
  394. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/process.py +0 -0
  395. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/version.py +0 -0
  396. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/window.py +0 -0
  397. {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/windows_schedule.py +0 -0
  398. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/dependency_links.txt +0 -0
  399. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/entry_points.txt +0 -0
  400. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/not-zip-safe +0 -0
  401. {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/top_level.txt +0 -0
  402. {ok_script-2.0.22 → ok_script-3.0.0}/setup.cfg +0 -0
  403. {ok_script-2.0.22 → ok_script-3.0.0}/setup.py +0 -0
  404. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_app.py +0 -0
  405. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_base_interaction.py +0 -0
  406. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_blur.py +0 -0
  407. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_box.py +0 -0
  408. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_capture_update.py +0 -0
  409. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_cli.py +0 -0
  410. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_core_events.py +0 -0
  411. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_core_ui_services.py +0 -0
  412. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_device_manager.py +0 -0
  413. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_executor_jobs.py +0 -0
  414. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_explorer.py +0 -0
  415. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_gpu_driver_settings.py +0 -0
  416. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_handler.py +0 -0
  417. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_inline_ok_requirements.py +0 -0
  418. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_logger.py +0 -0
  419. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_cleanup.py +0 -0
  420. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_runner.py +0 -0
  421. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_server.py +0 -0
  422. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_missing_frame.py +0 -0
  423. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_nemu_ipc_capture.py +0 -0
  424. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_notifications.py +0 -0
  425. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_ok_mutex.py +0 -0
  426. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_overlay_custom_draw.py +0 -0
  427. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_overlay_lifecycle.py +0 -0
  428. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_package_metadata.py +0 -0
  429. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_plugins.py +0 -0
  430. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_process.py +0 -0
  431. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_process_mutex.py +0 -0
  432. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_qt_events.py +0 -0
  433. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_runtime_startup.py +0 -0
  434. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_schedule_task_index_sync.py +0 -0
  435. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_screenshot_naming.py +0 -0
  436. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_screenshot_rendering.py +0 -0
  437. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_skills.py +0 -0
  438. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_start_controller.py +0 -0
  439. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_task_executor_next_frame.py +0 -0
  440. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_task_executor_queue.py +0 -0
  441. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_task_reloading.py +0 -0
  442. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_template_compression.py +0 -0
  443. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_template_generation.py +0 -0
  444. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_touch_scroll.py +0 -0
  445. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_translation_fallback.py +0 -0
  446. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_ui_config.py +0 -0
  447. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_version.py +0 -0
  448. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_graphics_capture.py +0 -0
  449. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_graphics_hdr.py +0 -0
  450. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_schedule_target_parse.py +0 -0
  451. {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_schedule_xml.py +0 -0
@@ -25,6 +25,8 @@ $projectPy = (Resolve-Path .\.venv\Scripts\python.exe).Path
25
25
 
26
26
  Run this from the application's root. Install the chosen OpenCV variant separately if it is absent.
27
27
 
28
+ The `qt` extra installs `ok-pyside-minimal`, which provides the `PySide6` package with only QtCore, QtGui, QtWidgets and QtSvg. Do not also install `PySide6`, `PySide6-Essentials` or `PySide6-Addons` in the same environment: they write the same `PySide6` folder. If an older environment has them (for example from PySide6-Fluent-Widgets), uninstall them or recreate the environment before installing the `qt` extra.
29
+
28
30
  Record the selected ok-script version or constraint, extras, and OpenCV variant in the application's existing dependency manifest or lockfile using its package manager. Keep setup reproducible without replacing unrelated dependencies.
29
31
 
30
32
  If the application intentionally uses an existing editable library installation or `ok` source link, preserve that arrangement and install its required dependencies in the application's environment. A source link alone does not install dependencies. Modify the application's tasks and configuration; library source changes are outside this skill's scope.
@@ -33,7 +35,7 @@ Use the normal package index first. If downloads stall, a reachable alternate in
33
35
 
34
36
  ## Verify the environment
35
37
 
36
- Run `& $projectPy -m pip check`. Smoke-test `import ok, cv2, mcp` and the selected optional stacks, and verify `ok.__file__` resolves to the intended checkout or installed package. For Qt, check `from PySide6 import QtCore` and `import qfluentwidgets`.
38
+ Run `& $projectPy -m pip check`. Smoke-test `import ok, cv2, mcp` and the selected optional stacks, and verify `ok.__file__` resolves to the intended checkout or installed package. For Qt, check `from PySide6 import QtCore, QtSvg` and `import ok.ui.qt.kit`.
37
39
 
38
40
  If the application already has a launcher, run it with its environment to catch runtime imports that dependency metadata alone cannot verify. Compile changed application scripts and run its existing tests when relevant.
39
41
 
@@ -66,6 +66,7 @@ ROOT = Path(__file__).resolve().parent
66
66
  config = {
67
67
  'version': '0.1.0',
68
68
  'gui_title': 'Automation Playground',
69
+ 'game_name': 'Target', # shown as "Start Target" when Start will launch it; defaults to "Game"
69
70
  'gui': {'type': 'qt'},
70
71
  'debug': False,
71
72
  'config_folder': str(ROOT / 'configs'),
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ok-script
3
- Version: 2.0.22
4
- Summary: Automation with Computer Vision for Python
3
+ Version: 3.0.0
4
+ Summary: Vibe Coding Automation Framework
5
5
  Author-email: ok-oldking <firedcto@gmail.com>
6
6
  License: ok-script License
7
7
  ================
@@ -106,10 +106,7 @@ Requires-Dist: Pillow>=10.0; extra == "default"
106
106
  Requires-Dist: ok-d3dshot>=0.1.5; extra == "default"
107
107
  Requires-Dist: OpenCC==1.2.0; extra == "default"
108
108
  Provides-Extra: qt
109
- Requires-Dist: PySide6-Essentials>=6.7.0; extra == "qt"
110
- Requires-Dist: PySideSix-Frameless-Window>=0.3.12; extra == "qt"
111
- Requires-Dist: darkdetect>=0.8.0; extra == "qt"
112
- Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "qt"
109
+ Requires-Dist: ok-pyside-minimal>=6.12.0.post2; extra == "qt"
113
110
  Provides-Extra: adb
114
111
  Requires-Dist: adbutils>=2.2.1; extra == "adb"
115
112
  Provides-Extra: ocr
@@ -129,11 +126,11 @@ Dynamic: license-file
129
126
 
130
127
  **简体中文** | [English](README_en.md)
131
128
 
132
- **开发时用 Token,写好的 Python 自动化脚本反复用。**
129
+ **Vibe Coding 自动化框架**
133
130
 
134
- 把需求告诉编程代理,通过 MCP 连接 ok-script,让代理观察应用、检查已安装 API、编写并测试 Python 任务。保存成果后,从应用 GUI 或命令行重复运行,无需代理或大模型调用。
131
+ 在 Codex、Claude Code 或任何支持 MCP 的编程代理里许个愿,得到一个可部署的自动化程序。
135
132
 
136
- 开发可能需要多轮验证,应用变化后也可能需要修复。目标是把 Token 用在脚本开发和维护上;日常执行由本地 Python 完成截图、识别和输入。
133
+ 说出你想自动化的事。代理通过 MCP 观察 Windows 应用、游戏或安卓设备,编写 Python 任务,在真实目标上运行并修复失败。ok-script 把完成的任务连同桌面 GUI 打包成可分发的 Windows 安装包。打包后的程序在本地独立完成截图、识别和输入,无需代理保持连接。
137
134
 
138
135
  ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提供模板匹配、OCR、目标支持时的后台输入、桌面界面和任务打包。
139
136
 
@@ -151,8 +148,24 @@ ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提
151
148
 
152
149
  > 连接这个项目的 ok-script MCP 服务,读取开发技能。检查已安装的截图、匹配和输入 API,给出准确签名和源码位置。开发可复用 Python 任务:打开设置、启用“显示详情”、保存并验证结果。每次尝试前恢复并验证起始界面,测试重复运行,代码保存到项目中。使用 ok-script API 和 MCP,不使用 Computer Use 工具。最后给出不依赖代理或大模型调用的准确运行命令。
153
150
 
151
+ 修复已有任务:
152
+
153
+ > 连接这个项目的 ok-script MCP 服务,读取 reload-tasks 技能。用 list_tasks 找到出错任务的源码,修改该文件,按任务 ID 重载并等待重载成功。恢复并验证起始界面,重复运行已注册的实现,并给出运行日志和截图中的证据。
154
+
155
+ ## MCP 开发流程
156
+
157
+ 代理用自己的工具编辑文件、读取日志;MCP 让它直接操作正在运行的应用:
158
+
159
+ 1. **学习**:`list_skills` 和 `get_skill` 返回当前安装版本自带的开发、模板、测试和重载流程;代理从已安装包中读取准确的 Python 签名。
160
+ 2. **观察**:`screenshot` 保存已配置窗口或设备的当前画面。
161
+ 3. **运行**:`run_task` 在真实目标上执行 Python 任务文件。每次尝试先恢复并验证起始状态,再由 `run()` 执行并断言自动化结果。
162
+ 4. **检查**:每次尝试写入 `logs/mcp/<run_id>/run.log`、`status.json` 和任务截图。`get_run_status` 报告进度和错误,`stop_task` 用于取消。
163
+ 5. **修复**:`list_tasks` 返回已注册任务的源码路径;修改后用 `reload_tasks` 在运行中的进程里替换。无法重置时用 `exit_process` 结束运行时。
164
+ 6. **交付**:在项目配置中注册任务,通过 GUI 或 `python -m ok run_task` 运行,并用 [PyAppify](https://github.com/ok-oldking/pyappify) 打包成 Windows 安装包。
165
+
154
166
  ## 特性
155
167
 
168
+ - 面向编程代理的 MCP 服务:内置技能、实时截图、任务执行、热重载和逐次运行日志
156
169
  - 纯 Python 实现,免费开源,可直接使用 pip 生态中的第三方库
157
170
  - 同一套任务代码可支持 Windows 客户端、安卓模拟器和 ADB 设备
158
171
  - 支持 OCR、OpenCV 模板匹配以及 YOLO 等视觉方案
@@ -173,7 +186,9 @@ python -m venv .venv
173
186
 
174
187
  启动命令要求应用配置已经存在,请使用实际配置入口或项目已有的开发启动器。MCP 自 2.0.17 起随 ok-script 自动安装,无需额外扩展。OpenCV 需单独选择并安装一个兼容变体;Qt、ADB 和 OCR 按需安装。
175
188
 
176
- 让代理的 MCP 客户端连接有效 `logs/mcp/connections/<pid>-<port>.json` 记录中的 URL,并使用该记录的 `Authorization: Bearer <token>` 请求头。不要公开凭据。让代理调用 `list_skills`,通过 `get_skill` 读取相关技能,再用 `screenshot` 验证目标。
189
+ 让代理的 MCP 客户端通过 Streamable HTTP 连接有效 `logs/mcp/connections/<pid>-<port>.json` 记录中的 URL,并使用该记录的 `Authorization: Bearer <token>` 请求头。不要公开凭据。让代理调用 `list_skills`,通过 `get_skill` 读取相关技能,再用 `screenshot` 验证目标。
190
+
191
+ 已有桌面应用也可以在 **设置 > 基本设置 > 启用 MCP 服务器** 中开启,或使用 `python -m ok gui --config src.config:config --mcp` 启动。服务只监听本机回环地址,但已连接的代理可以用你的账户权限执行 Python。日常使用请保留单独的、关闭 MCP 的启动器。
177
192
 
178
193
  [MCP 快速开始](docs/quick_start/README.md)介绍安装、连接以及脱离代理运行保存的任务。[MCP 说明(英文)](docs/mcp.md)包含执行和重载细节。
179
194
 
@@ -200,20 +215,30 @@ python -m venv .venv
200
215
 
201
216
  ## 使用 ok-script 的项目
202
217
 
203
- - [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
204
218
  - [鸣潮](https://github.com/ok-oldking/ok-wuthering-waves)
205
- - [原神](https://github.com/ok-oldking/ok-genshin-impact)(停止维护,后台过剧情仍可用)
219
+ - [异环](https://github.com/BnanZ0/ok-nte)
220
+ - [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
221
+ - [明日方舟:终末地](https://github.com/AliceJump/ok-end-field)
206
222
  - [少女前线 2](https://github.com/ok-oldking/ok-gf2)
207
- - [崩坏:星穹铁道](https://github.com/Shasnow/ok-starrailassistant)
223
+ - [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
224
+ - [棕色尘埃 2](https://github.com/GodRaymond233/ok-bd2)
208
225
  - [星痕共鸣](https://github.com/Sanheiii/ok-star-resonance)
209
- - [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
210
226
  - [卡厄思梦境](https://github.com/baoxin1100/ok-kes)
227
+ - [蓝色星原:旅谣](https://github.com/longer-sausage/OK-AzurPromilia)
211
228
  - [阴阳师](https://github.com/YunLiuZ/ok-Onmyoji)
229
+ - [原神](https://github.com/ok-oldking/ok-genshin-impact)(停止维护,后台过剧情仍可用)
212
230
  - [白荆回廊](https://github.com/ok-oldking/ok-baijing)(停止维护)
213
- - [明日方舟:终末地](https://github.com/AliceJump/ok-end-field)
214
- - [异环](https://github.com/BnanZ0/ok-nte)
215
- - [棕色尘埃 2](https://github.com/GodRaymond233/ok-bd2)
216
- - [蓝色星原:旅谣](https://github.com/longer-sausage/OK-AzurPromilia)
231
+ - [崩坏:星穹铁道](https://github.com/Shasnow/ok-starrailassistant)(停止维护)
232
+
233
+ ## 开发 ok-script
234
+
235
+ 在本仓库中测试界面改动时,可以用 [main.py](main.py) 中的演示配置直接从源码启动 GUI:
236
+
237
+ ```powershell
238
+ .\.venv\Scripts\python.exe main.py
239
+ ```
240
+
241
+ 它以记事本为目标窗口,无需游戏,并注册了一个演示一次性任务和一个触发任务,让任务、计划任务和模板页面都有内容。设置和日志保存在已被 git 忽略的 `configs/` 和 `logs/` 目录中。需要测试其他选项时,修改 `main.py` 中的 `config` 字典或演示任务即可。
217
242
 
218
243
  ## 社区与发布
219
244
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  **简体中文** | [English](README_en.md)
4
4
 
5
- **开发时用 Token,写好的 Python 自动化脚本反复用。**
5
+ **Vibe Coding 自动化框架**
6
6
 
7
- 把需求告诉编程代理,通过 MCP 连接 ok-script,让代理观察应用、检查已安装 API、编写并测试 Python 任务。保存成果后,从应用 GUI 或命令行重复运行,无需代理或大模型调用。
7
+ 在 Codex、Claude Code 或任何支持 MCP 的编程代理里许个愿,得到一个可部署的自动化程序。
8
8
 
9
- 开发可能需要多轮验证,应用变化后也可能需要修复。目标是把 Token 用在脚本开发和维护上;日常执行由本地 Python 完成截图、识别和输入。
9
+ 说出你想自动化的事。代理通过 MCP 观察 Windows 应用、游戏或安卓设备,编写 Python 任务,在真实目标上运行并修复失败。ok-script 把完成的任务连同桌面 GUI 打包成可分发的 Windows 安装包。打包后的程序在本地独立完成截图、识别和输入,无需代理保持连接。
10
10
 
11
11
  ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提供模板匹配、OCR、目标支持时的后台输入、桌面界面和任务打包。
12
12
 
@@ -24,8 +24,24 @@ ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提
24
24
 
25
25
  > 连接这个项目的 ok-script MCP 服务,读取开发技能。检查已安装的截图、匹配和输入 API,给出准确签名和源码位置。开发可复用 Python 任务:打开设置、启用“显示详情”、保存并验证结果。每次尝试前恢复并验证起始界面,测试重复运行,代码保存到项目中。使用 ok-script API 和 MCP,不使用 Computer Use 工具。最后给出不依赖代理或大模型调用的准确运行命令。
26
26
 
27
+ 修复已有任务:
28
+
29
+ > 连接这个项目的 ok-script MCP 服务,读取 reload-tasks 技能。用 list_tasks 找到出错任务的源码,修改该文件,按任务 ID 重载并等待重载成功。恢复并验证起始界面,重复运行已注册的实现,并给出运行日志和截图中的证据。
30
+
31
+ ## MCP 开发流程
32
+
33
+ 代理用自己的工具编辑文件、读取日志;MCP 让它直接操作正在运行的应用:
34
+
35
+ 1. **学习**:`list_skills` 和 `get_skill` 返回当前安装版本自带的开发、模板、测试和重载流程;代理从已安装包中读取准确的 Python 签名。
36
+ 2. **观察**:`screenshot` 保存已配置窗口或设备的当前画面。
37
+ 3. **运行**:`run_task` 在真实目标上执行 Python 任务文件。每次尝试先恢复并验证起始状态,再由 `run()` 执行并断言自动化结果。
38
+ 4. **检查**:每次尝试写入 `logs/mcp/<run_id>/run.log`、`status.json` 和任务截图。`get_run_status` 报告进度和错误,`stop_task` 用于取消。
39
+ 5. **修复**:`list_tasks` 返回已注册任务的源码路径;修改后用 `reload_tasks` 在运行中的进程里替换。无法重置时用 `exit_process` 结束运行时。
40
+ 6. **交付**:在项目配置中注册任务,通过 GUI 或 `python -m ok run_task` 运行,并用 [PyAppify](https://github.com/ok-oldking/pyappify) 打包成 Windows 安装包。
41
+
27
42
  ## 特性
28
43
 
44
+ - 面向编程代理的 MCP 服务:内置技能、实时截图、任务执行、热重载和逐次运行日志
29
45
  - 纯 Python 实现,免费开源,可直接使用 pip 生态中的第三方库
30
46
  - 同一套任务代码可支持 Windows 客户端、安卓模拟器和 ADB 设备
31
47
  - 支持 OCR、OpenCV 模板匹配以及 YOLO 等视觉方案
@@ -46,7 +62,9 @@ python -m venv .venv
46
62
 
47
63
  启动命令要求应用配置已经存在,请使用实际配置入口或项目已有的开发启动器。MCP 自 2.0.17 起随 ok-script 自动安装,无需额外扩展。OpenCV 需单独选择并安装一个兼容变体;Qt、ADB 和 OCR 按需安装。
48
64
 
49
- 让代理的 MCP 客户端连接有效 `logs/mcp/connections/<pid>-<port>.json` 记录中的 URL,并使用该记录的 `Authorization: Bearer <token>` 请求头。不要公开凭据。让代理调用 `list_skills`,通过 `get_skill` 读取相关技能,再用 `screenshot` 验证目标。
65
+ 让代理的 MCP 客户端通过 Streamable HTTP 连接有效 `logs/mcp/connections/<pid>-<port>.json` 记录中的 URL,并使用该记录的 `Authorization: Bearer <token>` 请求头。不要公开凭据。让代理调用 `list_skills`,通过 `get_skill` 读取相关技能,再用 `screenshot` 验证目标。
66
+
67
+ 已有桌面应用也可以在 **设置 > 基本设置 > 启用 MCP 服务器** 中开启,或使用 `python -m ok gui --config src.config:config --mcp` 启动。服务只监听本机回环地址,但已连接的代理可以用你的账户权限执行 Python。日常使用请保留单独的、关闭 MCP 的启动器。
50
68
 
51
69
  [MCP 快速开始](docs/quick_start/README.md)介绍安装、连接以及脱离代理运行保存的任务。[MCP 说明(英文)](docs/mcp.md)包含执行和重载细节。
52
70
 
@@ -73,20 +91,30 @@ python -m venv .venv
73
91
 
74
92
  ## 使用 ok-script 的项目
75
93
 
76
- - [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
77
94
  - [鸣潮](https://github.com/ok-oldking/ok-wuthering-waves)
78
- - [原神](https://github.com/ok-oldking/ok-genshin-impact)(停止维护,后台过剧情仍可用)
95
+ - [异环](https://github.com/BnanZ0/ok-nte)
96
+ - [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
97
+ - [明日方舟:终末地](https://github.com/AliceJump/ok-end-field)
79
98
  - [少女前线 2](https://github.com/ok-oldking/ok-gf2)
80
- - [崩坏:星穹铁道](https://github.com/Shasnow/ok-starrailassistant)
99
+ - [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
100
+ - [棕色尘埃 2](https://github.com/GodRaymond233/ok-bd2)
81
101
  - [星痕共鸣](https://github.com/Sanheiii/ok-star-resonance)
82
- - [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
83
102
  - [卡厄思梦境](https://github.com/baoxin1100/ok-kes)
103
+ - [蓝色星原:旅谣](https://github.com/longer-sausage/OK-AzurPromilia)
84
104
  - [阴阳师](https://github.com/YunLiuZ/ok-Onmyoji)
105
+ - [原神](https://github.com/ok-oldking/ok-genshin-impact)(停止维护,后台过剧情仍可用)
85
106
  - [白荆回廊](https://github.com/ok-oldking/ok-baijing)(停止维护)
86
- - [明日方舟:终末地](https://github.com/AliceJump/ok-end-field)
87
- - [异环](https://github.com/BnanZ0/ok-nte)
88
- - [棕色尘埃 2](https://github.com/GodRaymond233/ok-bd2)
89
- - [蓝色星原:旅谣](https://github.com/longer-sausage/OK-AzurPromilia)
107
+ - [崩坏:星穹铁道](https://github.com/Shasnow/ok-starrailassistant)(停止维护)
108
+
109
+ ## 开发 ok-script
110
+
111
+ 在本仓库中测试界面改动时,可以用 [main.py](main.py) 中的演示配置直接从源码启动 GUI:
112
+
113
+ ```powershell
114
+ .\.venv\Scripts\python.exe main.py
115
+ ```
116
+
117
+ 它以记事本为目标窗口,无需游戏,并注册了一个演示一次性任务和一个触发任务,让任务、计划任务和模板页面都有内容。设置和日志保存在已被 git 忽略的 `configs/` 和 `logs/` 目录中。需要测试其他选项时,修改 `main.py` 中的 `config` 字典或演示任务即可。
90
118
 
91
119
  ## 社区与发布
92
120
 
@@ -310,6 +310,8 @@ class App(_OverlayConfigMixin):
310
310
  self.global_config = task_executor.global_config if task_executor else None
311
311
  from ok.ui.qt.util.app import init_app_config
312
312
  self.app, self.locale = init_app_config()
313
+ from ok.ui.qt.common.config import cfg as ui_config
314
+ ui_config.language_changed.connect(self._on_language_changed)
313
315
  install_qt_event_dispatcher()
314
316
  self.app.aboutToQuit.connect(self._close_device_manager)
315
317
  if task_executor is not None:
@@ -461,6 +463,44 @@ class App(_OverlayConfigMixin):
461
463
  self.do_show_main()
462
464
 
463
465
  def do_show_main(self):
466
+ self._create_main_window()
467
+ self.main_window.show()
468
+ self.main_window.bring_to_front()
469
+
470
+ logger.debug(f'show_main_window end')
471
+
472
+ def _on_language_changed(self):
473
+ # The signal comes from a widget in the window being replaced; rebuild once it returns.
474
+ from PySide6.QtCore import QTimer
475
+ QTimer.singleShot(0, self._apply_language)
476
+
477
+ def _apply_language(self):
478
+ from ok.ui.qt.util.app import install_translator
479
+ self.locale = install_translator(self.app)
480
+ self.po_translation = None
481
+ if og.executor is not None:
482
+ og.executor.locale = self.locale
483
+ og.executor.load_tr()
484
+ logger.info(f'language changed to {self.locale.name()}')
485
+
486
+ old_window = self.main_window
487
+ if old_window is None:
488
+ return
489
+ # Every page translates its text on construction, so build a fresh window.
490
+ visible = old_window.isVisible()
491
+ old_window.update_ok_config()
492
+ old_window.dispose()
493
+ self._create_main_window()
494
+ # Startup work in the first showEvent has already run for this process.
495
+ self.main_window.shown = True
496
+ self.main_window.switch_to(self.main_window.setting_tab)
497
+ if visible:
498
+ self.main_window.show()
499
+ self.main_window.bring_to_front()
500
+ old_window.hide()
501
+ old_window.deleteLater()
502
+
503
+ def _create_main_window(self):
464
504
  from ok.ui.qt.MainWindow import MainWindow
465
505
 
466
506
  self.main_window = MainWindow(self, self.config, self.ok_config, self.icon, self.title, self.version,
@@ -482,11 +522,6 @@ class App(_OverlayConfigMixin):
482
522
  if hasattr(og.my_app, 'on_show_main_window'):
483
523
  og.my_app.on_show_main_window(self.main_window)
484
524
 
485
- self.main_window.show()
486
- self.main_window.bring_to_front()
487
-
488
- logger.debug(f'show_main_window end')
489
-
490
525
  def exec(self):
491
526
  logger.info('app.exec()')
492
527
  import signal
@@ -45,6 +45,10 @@ class EventSignal:
45
45
  elif callback in self._subscribers:
46
46
  self._subscribers.remove(callback)
47
47
 
48
+ def disconnect_where(self, predicate: Callable[[Callable[..., Any]], bool]) -> None:
49
+ with self._lock:
50
+ self._subscribers = [callback for callback in self._subscribers if not predicate(callback)]
51
+
48
52
  def emit(self, *args: Any, **kwargs: Any) -> None:
49
53
  with self._lock:
50
54
  subscribers = tuple(self._subscribers)
@@ -94,6 +98,12 @@ class EventBus:
94
98
  self.any.emit(EventMessage(name, args, kwargs))
95
99
  return forward
96
100
 
101
+ def disconnect_where(self, predicate: Callable[[Callable[..., Any]], bool]) -> None:
102
+ """Remove every subscriber of every event for which ``predicate`` is true."""
103
+ self.any.disconnect_where(predicate)
104
+ for name in self._event_names:
105
+ getattr(self, name).disconnect_where(predicate)
106
+
97
107
  def emit_draw_box(self, key=None, boxes=None, color=None, frame=None, debug=True):
98
108
  self.draw_box.emit(key, boxes, color, frame, debug)
99
109
 
@@ -1,3 +1,4 @@
1
+ import threading
1
2
  import time
2
3
 
3
4
  from ok import Handler, og
@@ -27,6 +28,25 @@ class StartController:
27
28
  self.start_method = windows_config.get('start_method', WINDOWS_START_METHOD_START)
28
29
  self.starting = False
29
30
 
31
+ @property
32
+ def _cancel_requested(self):
33
+ event = self.__dict__.get('_cancel_event')
34
+ if event is None:
35
+ event = self.__dict__['_cancel_event'] = threading.Event()
36
+ return event
37
+
38
+ def cancel_start(self):
39
+ """Stop waiting for the game to launch; the game process is left running."""
40
+ logger.info('cancel_start requested')
41
+ self._cancel_requested.set()
42
+
43
+ def _cancelled(self):
44
+ if self._cancel_requested.is_set():
45
+ logger.info('start cancelled while waiting for the game')
46
+ communicate.starting_emulator.emit(True, None, 0)
47
+ return True
48
+ return False
49
+
30
50
  def tr(self, message):
31
51
  app = getattr(og, "app", None)
32
52
  return app.tr(message) if app is not None else message
@@ -50,6 +70,7 @@ class StartController:
50
70
 
51
71
  def do_start(self, task=None, exit_after=False):
52
72
  self.starting = True
73
+ self._cancel_requested.clear()
53
74
  try:
54
75
  return self._do_start(task, exit_after)
55
76
  finally:
@@ -137,6 +158,8 @@ class StartController:
137
158
  wait_until = time.time() + self.start_timeout
138
159
  first_check = True
139
160
  while not self.exit_event.is_set():
161
+ if self._cancelled():
162
+ return False
140
163
  if refresh_first or not first_check:
141
164
  og.device_manager.do_refresh(True)
142
165
  first_check = False
@@ -159,6 +182,8 @@ class StartController:
159
182
  min_width, min_height = self.STARTED_WINDOW_MIN_SIZE
160
183
 
161
184
  while not self.exit_event.is_set():
185
+ if self._cancelled():
186
+ return False
162
187
  hwnd_window = getattr(og.device_manager, 'hwnd_window', None)
163
188
  if hwnd_window is not None:
164
189
  hwnd_window.do_update_window_size()
@@ -1,11 +1,13 @@
1
1
  from pathlib import Path
2
2
 
3
3
 
4
+ # Fits a 1600x900 screen with a taskbar (about 1600x852 available). The minimum
5
+ # equals the default so the layout always looks the same.
4
6
  DEFAULT_WINDOW_SIZE = {
5
- "width": 1200,
6
- "height": 800,
7
- "min_width": 1200,
8
- "min_height": 800,
7
+ "width": 1560,
8
+ "height": 820,
9
+ "min_width": 1560,
10
+ "min_height": 820,
9
11
  }
10
12
 
11
13
  GUI_TYPES = {"qt"}
@@ -2,6 +2,7 @@ import ctypes
2
2
  import threading
3
3
  import time
4
4
 
5
+ import cv2
5
6
  import numpy as np
6
7
  import win32gui
7
8
 
@@ -33,9 +34,11 @@ class WindowsGraphicsCaptureMethod(BaseWindowsCaptureMethod):
33
34
  return DirectXPixelFormat.B8G8R8A8UIntNormalized
34
35
 
35
36
  def read_mapped_frame(self, mapinfo):
36
- return np.ctypeslib.as_array(ctypes.cast(mapinfo.pData, PBYTE),
37
- (self.last_size.Height, mapinfo.RowPitch // 4, 4))[
38
- :, :self.last_size.Width].copy()
37
+ mapped = np.ctypeslib.as_array(ctypes.cast(mapinfo.pData, PBYTE),
38
+ (self.last_size.Height, mapinfo.RowPitch // 4, 4))[:, :self.last_size.Width]
39
+ # One pass copies out of the mapped buffer and drops alpha, giving a
40
+ # contiguous BGR frame instead of a strided view of a BGRA copy.
41
+ return cv2.cvtColor(mapped, cv2.COLOR_BGRA2BGR)
39
42
 
40
43
  def __init__(self, hwnd_window):
41
44
  super().__init__(hwnd_window)
@@ -46,7 +46,7 @@ class WindowsGraphicsCaptureHDRMethod(WindowsGraphicsCaptureMethod):
46
46
  def read_mapped_frame(self, mapinfo):
47
47
  height, width = self.last_size.Height, self.last_size.Width
48
48
  # RowPitch includes driver padding. The buffer is only valid until
49
- # Unmap, so return an owned BGRA array just like the SDR capture path.
49
+ # Unmap, so return an owned BGRA array.
50
50
  buffer = np.ctypeslib.as_array(ctypes.cast(mapinfo.pData, PBYTE),
51
51
  (height * mapinfo.RowPitch,))
52
52
  rgba_bits = np.ndarray((height, width, 4), dtype=np.uint16,
@@ -268,16 +268,12 @@ class Box:
268
268
  :param condition: Optional condition function. 可选条件函数。
269
269
  :return: Closest Box or None. 最近的框或 None。
270
270
  """
271
- orig_x = self.x
272
- orig_y = self.y
273
- orig_w = self.width
274
- orig_h = self.height
275
-
276
- boxes.sort(key=lambda box: self._distance_criteria(box, direction, orig_x, orig_y, orig_w, orig_h, condition))
271
+ best, best_distance = None, float('inf')
277
272
  for box in boxes:
278
- if self._distance_criteria(box, direction, orig_x, orig_y, orig_w, orig_h, condition) != float('inf'):
279
- return box
280
- return None
273
+ distance = self._distance_criteria(box, direction, self.x, self.y, self.width, self.height, condition)
274
+ if distance < best_distance:
275
+ best, best_distance = box, distance
276
+ return best
281
277
 
282
278
 
283
279
  def box_intersect(box1, box2):
@@ -335,7 +331,7 @@ def find_box_by_name(boxes, names):
335
331
  for box in boxes:
336
332
  for i, name in enumerate(names):
337
333
  if (isinstance(name, str) and name == box.name) or (
338
- isinstance(name, re.Pattern) and re.search(name, box.name)):
334
+ isinstance(name, re.Pattern) and isinstance(box.name, str) and re.search(name, box.name)):
339
335
  if i < priority:
340
336
  priority = i
341
337
  result = box
@@ -435,18 +431,7 @@ def find_boxes_by_name(boxes, names):
435
431
  if isinstance(names, (str, re.Pattern)):
436
432
  names = [names]
437
433
 
438
- result = []
439
-
440
- for box in boxes:
441
- matched = False
442
- for name in names:
443
- if matched:
444
- break
445
- if (isinstance(name, str) and name == box.name) or (isinstance(box.name, str) and
446
- isinstance(name, re.Pattern) and re.search(name,
447
- box.name)):
448
- matched = True
449
- if matched:
450
- result.append(box)
451
-
452
- return result
434
+ return [box for box in boxes if any(
435
+ (isinstance(name, str) and name == box.name) or
436
+ (isinstance(name, re.Pattern) and isinstance(box.name, str) and re.search(name, box.name))
437
+ for name in names)]
@@ -28,8 +28,5 @@ class Feature:
28
28
  def height(self):
29
29
  return self.mat.shape[0]
30
30
 
31
- def scaling(self):
32
- return self.scaling
33
-
34
31
  def __str__(self) -> str:
35
32
  return str(f'self.x: {self.x}, self.y: {self.y}, width: {self.width}, height: {self.height}')