AutoCua 0.1.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 (424) hide show
  1. autocua-0.1.0/AutoCua/__init__.py +323 -0
  2. autocua-0.1.0/AutoCua/agent_conversation/__init__.py +12 -0
  3. autocua-0.1.0/AutoCua/agent_conversation/service.py +875 -0
  4. autocua-0.1.0/AutoCua/agent_launcher.py +845 -0
  5. autocua-0.1.0/AutoCua/data_extraction.py +207 -0
  6. autocua-0.1.0/AutoCua/default_skills/ios/instagram.md +150 -0
  7. autocua-0.1.0/AutoCua/default_skills/ios/skills.json +7 -0
  8. autocua-0.1.0/AutoCua/default_skills/linux/browser.md +27 -0
  9. autocua-0.1.0/AutoCua/default_skills/linux/skills.json +13 -0
  10. autocua-0.1.0/AutoCua/default_skills/mac/browser.md +26 -0
  11. autocua-0.1.0/AutoCua/default_skills/mac/libreoffice_calc.md +22 -0
  12. autocua-0.1.0/AutoCua/default_skills/mac/maps.md +15 -0
  13. autocua-0.1.0/AutoCua/default_skills/mac/skills.json +14 -0
  14. autocua-0.1.0/AutoCua/default_skills/web/domain_skill/google_sheets.md +65 -0
  15. autocua-0.1.0/AutoCua/default_skills/web/domain_skill/skills.json +3 -0
  16. autocua-0.1.0/AutoCua/default_skills/web/skills/scraping.md +102 -0
  17. autocua-0.1.0/AutoCua/default_skills/windows/browser.md +24 -0
  18. autocua-0.1.0/AutoCua/default_skills/windows/libreoffice_calc.md +22 -0
  19. autocua-0.1.0/AutoCua/default_skills/windows/skills.json +11 -0
  20. autocua-0.1.0/AutoCua/frontend/__init__.py +4 -0
  21. autocua-0.1.0/AutoCua/frontend/agent_mode/agent_mode.css +365 -0
  22. autocua-0.1.0/AutoCua/frontend/agent_mode/agent_mode.html +105 -0
  23. autocua-0.1.0/AutoCua/frontend/agent_mode/agent_mode.js +202 -0
  24. autocua-0.1.0/AutoCua/frontend/agent_mode/ios_session.js +255 -0
  25. autocua-0.1.0/AutoCua/frontend/chat/chat.css +173 -0
  26. autocua-0.1.0/AutoCua/frontend/chat/chat.html +10 -0
  27. autocua-0.1.0/AutoCua/frontend/chat/chat.js +310 -0
  28. autocua-0.1.0/AutoCua/frontend/chat_input/chat_input.css +1087 -0
  29. autocua-0.1.0/AutoCua/frontend/chat_input/chat_input.html +97 -0
  30. autocua-0.1.0/AutoCua/frontend/chat_input/chat_input.js +320 -0
  31. autocua-0.1.0/AutoCua/frontend/chat_input/pc_button.html +347 -0
  32. autocua-0.1.0/AutoCua/frontend/chat_input/send_button.html +304 -0
  33. autocua-0.1.0/AutoCua/frontend/cli/cli.html +305 -0
  34. autocua-0.1.0/AutoCua/frontend/cli/cli_container/coder_card.css +704 -0
  35. autocua-0.1.0/AutoCua/frontend/cli/cli_container/coder_card.js +1177 -0
  36. autocua-0.1.0/AutoCua/frontend/cli/cli_container/tool_icons.js +750 -0
  37. autocua-0.1.0/AutoCua/frontend/cli/cli_stage.css +54 -0
  38. autocua-0.1.0/AutoCua/frontend/cli/cli_stage.js +562 -0
  39. autocua-0.1.0/AutoCua/frontend/container/big_center_container/big_center_container.css +28 -0
  40. autocua-0.1.0/AutoCua/frontend/container/big_center_container/big_center_container.html +7 -0
  41. autocua-0.1.0/AutoCua/frontend/container/big_center_container/big_center_container.js +37 -0
  42. autocua-0.1.0/AutoCua/frontend/container/bottom_left/bottom_left.css +151 -0
  43. autocua-0.1.0/AutoCua/frontend/container/bottom_left/bottom_left.html +12 -0
  44. autocua-0.1.0/AutoCua/frontend/container/bottom_left/bottom_left.js +1767 -0
  45. autocua-0.1.0/AutoCua/frontend/container/bottom_right/bottom_right.css +199 -0
  46. autocua-0.1.0/AutoCua/frontend/container/bottom_right/bottom_right.html +14 -0
  47. autocua-0.1.0/AutoCua/frontend/container/bottom_right/bottom_right.js +153 -0
  48. autocua-0.1.0/AutoCua/frontend/container/top_left/globe_shell.css +130 -0
  49. autocua-0.1.0/AutoCua/frontend/container/top_left/globe_shell.js +171 -0
  50. autocua-0.1.0/AutoCua/frontend/container/top_left/top_left.css +56 -0
  51. autocua-0.1.0/AutoCua/frontend/container/top_left/top_left.html +34 -0
  52. autocua-0.1.0/AutoCua/frontend/container/top_left/top_left.js +28 -0
  53. autocua-0.1.0/AutoCua/frontend/container/top_right/top_right.css +191 -0
  54. autocua-0.1.0/AutoCua/frontend/container/top_right/top_right.html +14 -0
  55. autocua-0.1.0/AutoCua/frontend/container/top_right/top_right.js +150 -0
  56. autocua-0.1.0/AutoCua/frontend/css/style.css +1849 -0
  57. autocua-0.1.0/AutoCua/frontend/device_connect/device_connect.css +334 -0
  58. autocua-0.1.0/AutoCua/frontend/device_connect/device_connect.js +417 -0
  59. autocua-0.1.0/AutoCua/frontend/index.html +535 -0
  60. autocua-0.1.0/AutoCua/frontend/intro_animation.html +560 -0
  61. autocua-0.1.0/AutoCua/frontend/left_bar/left_bar.css +157 -0
  62. autocua-0.1.0/AutoCua/frontend/left_bar/left_bar.html +31 -0
  63. autocua-0.1.0/AutoCua/frontend/left_bar/left_bar.js +75 -0
  64. autocua-0.1.0/AutoCua/frontend/markdown.py +412 -0
  65. autocua-0.1.0/AutoCua/frontend/memory_bar/memory_bar.css +116 -0
  66. autocua-0.1.0/AutoCua/frontend/memory_bar/memory_bar.html +27 -0
  67. autocua-0.1.0/AutoCua/frontend/memory_bar/memory_bar.js +72 -0
  68. autocua-0.1.0/AutoCua/frontend/notes_stage/notes_stage.css +209 -0
  69. autocua-0.1.0/AutoCua/frontend/notes_stage/notes_stage.html +14 -0
  70. autocua-0.1.0/AutoCua/frontend/notes_stage/notes_stage.js +171 -0
  71. autocua-0.1.0/AutoCua/frontend/script.js +2106 -0
  72. autocua-0.1.0/AutoCua/frontend/service.py +3949 -0
  73. autocua-0.1.0/AutoCua/frontend/settings/settings.css +87 -0
  74. autocua-0.1.0/AutoCua/frontend/settings/settings.html +14 -0
  75. autocua-0.1.0/AutoCua/frontend/settings/settings.js +73 -0
  76. autocua-0.1.0/AutoCua/frontend/setup/setup.css +319 -0
  77. autocua-0.1.0/AutoCua/frontend/setup/setup.html +75 -0
  78. autocua-0.1.0/AutoCua/frontend/setup/setup.js +350 -0
  79. autocua-0.1.0/AutoCua/frontend/skills/skills.css +518 -0
  80. autocua-0.1.0/AutoCua/frontend/skills/skills.html +35 -0
  81. autocua-0.1.0/AutoCua/frontend/skills/skills.js +522 -0
  82. autocua-0.1.0/AutoCua/frontend/skills/skills_stage.html +100 -0
  83. autocua-0.1.0/AutoCua/ios/__init__.py +0 -0
  84. autocua-0.1.0/AutoCua/ios/agent/__init__.py +5 -0
  85. autocua-0.1.0/AutoCua/ios/agent/__main__.py +97 -0
  86. autocua-0.1.0/AutoCua/ios/agent/main_driver/__init__.py +5 -0
  87. autocua-0.1.0/AutoCua/ios/agent/main_driver/claude_prompt.md +242 -0
  88. autocua-0.1.0/AutoCua/ios/agent/main_driver/fast_system_prompt.md +164 -0
  89. autocua-0.1.0/AutoCua/ios/agent/main_driver/service.py +1295 -0
  90. autocua-0.1.0/AutoCua/ios/agent/main_driver/system_prompt.md +242 -0
  91. autocua-0.1.0/AutoCua/ios/agent/main_driver/view.py +406 -0
  92. autocua-0.1.0/AutoCua/ios/agent/skills/__init__.py +3 -0
  93. autocua-0.1.0/AutoCua/ios/agent/skills/service.py +116 -0
  94. autocua-0.1.0/AutoCua/ios/controller/__init__.py +8 -0
  95. autocua-0.1.0/AutoCua/ios/controller/scratchpad/__init__.py +3 -0
  96. autocua-0.1.0/AutoCua/ios/controller/scratchpad/service.py +74 -0
  97. autocua-0.1.0/AutoCua/ios/controller/service.py +253 -0
  98. autocua-0.1.0/AutoCua/ios/controller/task_tracker/__init__.py +4 -0
  99. autocua-0.1.0/AutoCua/ios/controller/task_tracker/service.py +115 -0
  100. autocua-0.1.0/AutoCua/ios/controller/tool/__init__.py +6 -0
  101. autocua-0.1.0/AutoCua/ios/controller/tool/open_app.py +396 -0
  102. autocua-0.1.0/AutoCua/ios/controller/tool/shell.py +204 -0
  103. autocua-0.1.0/AutoCua/ios/controller/tool/videoplayer.py +413 -0
  104. autocua-0.1.0/AutoCua/ios/controller/tool/web/anthropic.py +51 -0
  105. autocua-0.1.0/AutoCua/ios/controller/tool/web/chatgpt.py +65 -0
  106. autocua-0.1.0/AutoCua/ios/controller/tool/web/google_search.py +58 -0
  107. autocua-0.1.0/AutoCua/ios/controller/tool/web/groq_search.py +52 -0
  108. autocua-0.1.0/AutoCua/ios/controller/tool/web/openrouter.py +64 -0
  109. autocua-0.1.0/AutoCua/ios/controller/tool/web/perplexity_search.py +58 -0
  110. autocua-0.1.0/AutoCua/ios/controller/tool/web/service.py +88 -0
  111. autocua-0.1.0/AutoCua/ios/controller/tool/web/web.md +24 -0
  112. autocua-0.1.0/AutoCua/ios/controller/tool/web/web_agent.py +200 -0
  113. autocua-0.1.0/AutoCua/ios/controller/view.py +505 -0
  114. autocua-0.1.0/AutoCua/ios/sandbox/__init__.py +10 -0
  115. autocua-0.1.0/AutoCua/ios/sandbox/service.py +395 -0
  116. autocua-0.1.0/AutoCua/ios/tool_registry/__init__.py +0 -0
  117. autocua-0.1.0/AutoCua/ios/tool_registry/service.py +295 -0
  118. autocua-0.1.0/AutoCua/ios/tree/__init__.py +4 -0
  119. autocua-0.1.0/AutoCua/ios/tree/element.py +812 -0
  120. autocua-0.1.0/AutoCua/ios_connector/__init__.py +3 -0
  121. autocua-0.1.0/AutoCua/ios_connector/build_paths.py +26 -0
  122. autocua-0.1.0/AutoCua/ios_connector/index.html +635 -0
  123. autocua-0.1.0/AutoCua/ios_connector/session.py +356 -0
  124. autocua-0.1.0/AutoCua/ios_connector/setup.py +1019 -0
  125. autocua-0.1.0/AutoCua/ios_connector/setup_server.py +70 -0
  126. autocua-0.1.0/AutoCua/ios_connector/sim_session.py +885 -0
  127. autocua-0.1.0/AutoCua/ios_connector/sim_view.html +223 -0
  128. autocua-0.1.0/AutoCua/ios_connector/sim_view.py +264 -0
  129. autocua-0.1.0/AutoCua/linux/agent/__init__.py +5 -0
  130. autocua-0.1.0/AutoCua/linux/agent/coder/__init__.py +4 -0
  131. autocua-0.1.0/AutoCua/linux/agent/coder/__main__.py +150 -0
  132. autocua-0.1.0/AutoCua/linux/agent/coder/claude_prompt.md +339 -0
  133. autocua-0.1.0/AutoCua/linux/agent/coder/service.py +1145 -0
  134. autocua-0.1.0/AutoCua/linux/agent/coder/system_prompt.md +339 -0
  135. autocua-0.1.0/AutoCua/linux/agent/coder/view.py +472 -0
  136. autocua-0.1.0/AutoCua/linux/agent/main_driver/__init__.py +5 -0
  137. autocua-0.1.0/AutoCua/linux/agent/main_driver/claude_prompt.md +287 -0
  138. autocua-0.1.0/AutoCua/linux/agent/main_driver/fast_system_prompt.md +210 -0
  139. autocua-0.1.0/AutoCua/linux/agent/main_driver/service.py +1436 -0
  140. autocua-0.1.0/AutoCua/linux/agent/main_driver/system_prompt.md +287 -0
  141. autocua-0.1.0/AutoCua/linux/agent/main_driver/view.py +378 -0
  142. autocua-0.1.0/AutoCua/linux/agent/minions/__init__.py +11 -0
  143. autocua-0.1.0/AutoCua/linux/agent/minions/__main__.py +107 -0
  144. autocua-0.1.0/AutoCua/linux/agent/minions/claude_prompt.md +381 -0
  145. autocua-0.1.0/AutoCua/linux/agent/minions/service.py +597 -0
  146. autocua-0.1.0/AutoCua/linux/agent/minions/system_prompt.md +381 -0
  147. autocua-0.1.0/AutoCua/linux/agent/minions/view.py +125 -0
  148. autocua-0.1.0/AutoCua/linux/agent/skills/__init__.py +4 -0
  149. autocua-0.1.0/AutoCua/linux/agent/skills/service.py +226 -0
  150. autocua-0.1.0/AutoCua/linux/controller/__init__.py +9 -0
  151. autocua-0.1.0/AutoCua/linux/controller/cli/__init__.py +4 -0
  152. autocua-0.1.0/AutoCua/linux/controller/cli/service.py +1023 -0
  153. autocua-0.1.0/AutoCua/linux/controller/hotkey/__init__.py +4 -0
  154. autocua-0.1.0/AutoCua/linux/controller/hotkey/service.py +104 -0
  155. autocua-0.1.0/AutoCua/linux/controller/scratchpad/__init__.py +3 -0
  156. autocua-0.1.0/AutoCua/linux/controller/scratchpad/service.py +88 -0
  157. autocua-0.1.0/AutoCua/linux/controller/service.py +449 -0
  158. autocua-0.1.0/AutoCua/linux/controller/task_tracker/__init__.py +4 -0
  159. autocua-0.1.0/AutoCua/linux/controller/task_tracker/service.py +128 -0
  160. autocua-0.1.0/AutoCua/linux/controller/tool/__init__.py +6 -0
  161. autocua-0.1.0/AutoCua/linux/controller/tool/app_script.py +113 -0
  162. autocua-0.1.0/AutoCua/linux/controller/tool/browser_agent.py +244 -0
  163. autocua-0.1.0/AutoCua/linux/controller/tool/browser_agent_child.py +86 -0
  164. autocua-0.1.0/AutoCua/linux/controller/tool/input_portal.py +994 -0
  165. autocua-0.1.0/AutoCua/linux/controller/tool/open_app.py +377 -0
  166. autocua-0.1.0/AutoCua/linux/controller/tool/plan.py +180 -0
  167. autocua-0.1.0/AutoCua/linux/controller/tool/screenshot.py +84 -0
  168. autocua-0.1.0/AutoCua/linux/controller/tool/shell.py +114 -0
  169. autocua-0.1.0/AutoCua/linux/controller/tool/web/anthropic.py +51 -0
  170. autocua-0.1.0/AutoCua/linux/controller/tool/web/chatgpt.py +65 -0
  171. autocua-0.1.0/AutoCua/linux/controller/tool/web/google_search.py +58 -0
  172. autocua-0.1.0/AutoCua/linux/controller/tool/web/groq_search.py +52 -0
  173. autocua-0.1.0/AutoCua/linux/controller/tool/web/openrouter.py +64 -0
  174. autocua-0.1.0/AutoCua/linux/controller/tool/web/perplexity_search.py +58 -0
  175. autocua-0.1.0/AutoCua/linux/controller/tool/web/service.py +88 -0
  176. autocua-0.1.0/AutoCua/linux/controller/tool/web/web.md +24 -0
  177. autocua-0.1.0/AutoCua/linux/controller/tool/web/web_agent.py +200 -0
  178. autocua-0.1.0/AutoCua/linux/controller/view.py +1580 -0
  179. autocua-0.1.0/AutoCua/linux/remote_connection/banner.py +2026 -0
  180. autocua-0.1.0/AutoCua/linux/remote_connection/telegram/service.py +1171 -0
  181. autocua-0.1.0/AutoCua/linux/remote_connection/telegram/setup.py +136 -0
  182. autocua-0.1.0/AutoCua/linux/remote_connection/telegram/telergam_animation.html +319 -0
  183. autocua-0.1.0/AutoCua/linux/remote_connection/telegram/view.py +140 -0
  184. autocua-0.1.0/AutoCua/linux/sandbox/__init__.py +10 -0
  185. autocua-0.1.0/AutoCua/linux/sandbox/service.py +383 -0
  186. autocua-0.1.0/AutoCua/linux/tool_registry/__init__.py +0 -0
  187. autocua-0.1.0/AutoCua/linux/tool_registry/service.py +797 -0
  188. autocua-0.1.0/AutoCua/linux/tree/element.py +5510 -0
  189. autocua-0.1.0/AutoCua/linux/tree/ocr.py +524 -0
  190. autocua-0.1.0/AutoCua/llm_provider/__init__.py +178 -0
  191. autocua-0.1.0/AutoCua/llm_provider/anthropic/__init__.py +4 -0
  192. autocua-0.1.0/AutoCua/llm_provider/anthropic/service.py +284 -0
  193. autocua-0.1.0/AutoCua/llm_provider/anthropic/view.py +140 -0
  194. autocua-0.1.0/AutoCua/llm_provider/aws/__init__.py +4 -0
  195. autocua-0.1.0/AutoCua/llm_provider/aws/service.py +290 -0
  196. autocua-0.1.0/AutoCua/llm_provider/aws/view.py +104 -0
  197. autocua-0.1.0/AutoCua/llm_provider/cerebras/__init__.py +4 -0
  198. autocua-0.1.0/AutoCua/llm_provider/cerebras/service.py +117 -0
  199. autocua-0.1.0/AutoCua/llm_provider/cerebras/view.py +28 -0
  200. autocua-0.1.0/AutoCua/llm_provider/google/__init__.py +4 -0
  201. autocua-0.1.0/AutoCua/llm_provider/google/service.py +307 -0
  202. autocua-0.1.0/AutoCua/llm_provider/google/view.py +99 -0
  203. autocua-0.1.0/AutoCua/llm_provider/groq/__init__.py +4 -0
  204. autocua-0.1.0/AutoCua/llm_provider/groq/service.py +110 -0
  205. autocua-0.1.0/AutoCua/llm_provider/groq/view.py +36 -0
  206. autocua-0.1.0/AutoCua/llm_provider/llm_manager.py +734 -0
  207. autocua-0.1.0/AutoCua/llm_provider/openai/__init__.py +4 -0
  208. autocua-0.1.0/AutoCua/llm_provider/openai/service.py +153 -0
  209. autocua-0.1.0/AutoCua/llm_provider/openai/view.py +70 -0
  210. autocua-0.1.0/AutoCua/llm_provider/openrouter/__init__.py +4 -0
  211. autocua-0.1.0/AutoCua/llm_provider/openrouter/service.py +245 -0
  212. autocua-0.1.0/AutoCua/llm_provider/openrouter/view.py +235 -0
  213. autocua-0.1.0/AutoCua/llm_provider/perplexity/__init__.py +0 -0
  214. autocua-0.1.0/AutoCua/llm_provider/perplexity/service.py +190 -0
  215. autocua-0.1.0/AutoCua/llm_provider/perplexity/view.py +121 -0
  216. autocua-0.1.0/AutoCua/llm_provider/responses.py +304 -0
  217. autocua-0.1.0/AutoCua/llm_provider/together/__init__.py +4 -0
  218. autocua-0.1.0/AutoCua/llm_provider/together/service.py +127 -0
  219. autocua-0.1.0/AutoCua/llm_provider/together/view.py +38 -0
  220. autocua-0.1.0/AutoCua/logo/agents.html +59 -0
  221. autocua-0.1.0/AutoCua/logo/agents.js +12 -0
  222. autocua-0.1.0/AutoCua/logo/logo.html +46 -0
  223. autocua-0.1.0/AutoCua/logo/logo.png +0 -0
  224. autocua-0.1.0/AutoCua/logo/simulation_background.mp4 +0 -0
  225. autocua-0.1.0/AutoCua/mac/__init__.py +0 -0
  226. autocua-0.1.0/AutoCua/mac/agent/__init__.py +5 -0
  227. autocua-0.1.0/AutoCua/mac/agent/coder/__init__.py +4 -0
  228. autocua-0.1.0/AutoCua/mac/agent/coder/__main__.py +150 -0
  229. autocua-0.1.0/AutoCua/mac/agent/coder/claude_prompt.md +338 -0
  230. autocua-0.1.0/AutoCua/mac/agent/coder/service.py +1145 -0
  231. autocua-0.1.0/AutoCua/mac/agent/coder/system_prompt.md +338 -0
  232. autocua-0.1.0/AutoCua/mac/agent/coder/view.py +472 -0
  233. autocua-0.1.0/AutoCua/mac/agent/main_driver/__init__.py +5 -0
  234. autocua-0.1.0/AutoCua/mac/agent/main_driver/claude_prompt.md +287 -0
  235. autocua-0.1.0/AutoCua/mac/agent/main_driver/fast_system_prompt.md +215 -0
  236. autocua-0.1.0/AutoCua/mac/agent/main_driver/service.py +1466 -0
  237. autocua-0.1.0/AutoCua/mac/agent/main_driver/system_prompt.md +287 -0
  238. autocua-0.1.0/AutoCua/mac/agent/main_driver/view.py +378 -0
  239. autocua-0.1.0/AutoCua/mac/agent/minions/__init__.py +11 -0
  240. autocua-0.1.0/AutoCua/mac/agent/minions/__main__.py +107 -0
  241. autocua-0.1.0/AutoCua/mac/agent/minions/claude_prompt.md +380 -0
  242. autocua-0.1.0/AutoCua/mac/agent/minions/service.py +597 -0
  243. autocua-0.1.0/AutoCua/mac/agent/minions/system_prompt.md +380 -0
  244. autocua-0.1.0/AutoCua/mac/agent/minions/view.py +125 -0
  245. autocua-0.1.0/AutoCua/mac/agent/skills/__init__.py +4 -0
  246. autocua-0.1.0/AutoCua/mac/agent/skills/service.py +226 -0
  247. autocua-0.1.0/AutoCua/mac/controller/__init__.py +9 -0
  248. autocua-0.1.0/AutoCua/mac/controller/cli/__init__.py +4 -0
  249. autocua-0.1.0/AutoCua/mac/controller/cli/service.py +1023 -0
  250. autocua-0.1.0/AutoCua/mac/controller/hotkey/__init__.py +4 -0
  251. autocua-0.1.0/AutoCua/mac/controller/hotkey/service.py +138 -0
  252. autocua-0.1.0/AutoCua/mac/controller/scratchpad/__init__.py +3 -0
  253. autocua-0.1.0/AutoCua/mac/controller/scratchpad/service.py +88 -0
  254. autocua-0.1.0/AutoCua/mac/controller/service.py +817 -0
  255. autocua-0.1.0/AutoCua/mac/controller/task_tracker/__init__.py +4 -0
  256. autocua-0.1.0/AutoCua/mac/controller/task_tracker/service.py +128 -0
  257. autocua-0.1.0/AutoCua/mac/controller/tool/__init__.py +6 -0
  258. autocua-0.1.0/AutoCua/mac/controller/tool/applescript.py +226 -0
  259. autocua-0.1.0/AutoCua/mac/controller/tool/browser_agent.py +244 -0
  260. autocua-0.1.0/AutoCua/mac/controller/tool/browser_agent_child.py +86 -0
  261. autocua-0.1.0/AutoCua/mac/controller/tool/open_app.py +255 -0
  262. autocua-0.1.0/AutoCua/mac/controller/tool/plan.py +180 -0
  263. autocua-0.1.0/AutoCua/mac/controller/tool/screenshot.py +96 -0
  264. autocua-0.1.0/AutoCua/mac/controller/tool/shell.py +114 -0
  265. autocua-0.1.0/AutoCua/mac/controller/tool/web/anthropic.py +51 -0
  266. autocua-0.1.0/AutoCua/mac/controller/tool/web/chatgpt.py +65 -0
  267. autocua-0.1.0/AutoCua/mac/controller/tool/web/google_search.py +58 -0
  268. autocua-0.1.0/AutoCua/mac/controller/tool/web/groq_search.py +52 -0
  269. autocua-0.1.0/AutoCua/mac/controller/tool/web/openrouter.py +64 -0
  270. autocua-0.1.0/AutoCua/mac/controller/tool/web/perplexity_search.py +58 -0
  271. autocua-0.1.0/AutoCua/mac/controller/tool/web/service.py +88 -0
  272. autocua-0.1.0/AutoCua/mac/controller/tool/web/web.md +24 -0
  273. autocua-0.1.0/AutoCua/mac/controller/tool/web/web_agent.py +200 -0
  274. autocua-0.1.0/AutoCua/mac/controller/view.py +1592 -0
  275. autocua-0.1.0/AutoCua/mac/remote_connection/banner.py +2105 -0
  276. autocua-0.1.0/AutoCua/mac/remote_connection/telegram/service.py +1082 -0
  277. autocua-0.1.0/AutoCua/mac/remote_connection/telegram/setup.py +111 -0
  278. autocua-0.1.0/AutoCua/mac/remote_connection/telegram/telergam_animation.html +308 -0
  279. autocua-0.1.0/AutoCua/mac/remote_connection/telegram/view.py +140 -0
  280. autocua-0.1.0/AutoCua/mac/sandbox/__init__.py +10 -0
  281. autocua-0.1.0/AutoCua/mac/sandbox/service.py +395 -0
  282. autocua-0.1.0/AutoCua/mac/tool_registry/__init__.py +0 -0
  283. autocua-0.1.0/AutoCua/mac/tool_registry/service.py +747 -0
  284. autocua-0.1.0/AutoCua/mac/tree/__init__.py +4 -0
  285. autocua-0.1.0/AutoCua/mac/tree/element.py +2677 -0
  286. autocua-0.1.0/AutoCua/mac/tree/ocr.py +159 -0
  287. autocua-0.1.0/AutoCua/memory_compression/__init__.py +13 -0
  288. autocua-0.1.0/AutoCua/memory_compression/agent/__init__.py +3 -0
  289. autocua-0.1.0/AutoCua/memory_compression/agent/service.py +144 -0
  290. autocua-0.1.0/AutoCua/memory_compression/agent/system_prompt.md +104 -0
  291. autocua-0.1.0/AutoCua/memory_compression/controller.py +171 -0
  292. autocua-0.1.0/AutoCua/memory_compression/memory_tracker.py +66 -0
  293. autocua-0.1.0/AutoCua/utils/__init__.py +22 -0
  294. autocua-0.1.0/AutoCua/utils/agent_glow.py +1733 -0
  295. autocua-0.1.0/AutoCua/utils/chrome.py +289 -0
  296. autocua-0.1.0/AutoCua/utils/ocr_models.py +225 -0
  297. autocua-0.1.0/AutoCua/utils/run_recorder.py +1568 -0
  298. autocua-0.1.0/AutoCua/utils/rust.py +150 -0
  299. autocua-0.1.0/AutoCua/utils/wda.py +106 -0
  300. autocua-0.1.0/AutoCua/vault/__init__.py +5 -0
  301. autocua-0.1.0/AutoCua/vault/service.py +397 -0
  302. autocua-0.1.0/AutoCua/web/Cargo.lock +1236 -0
  303. autocua-0.1.0/AutoCua/web/Cargo.toml +53 -0
  304. autocua-0.1.0/AutoCua/web/__init__.py +0 -0
  305. autocua-0.1.0/AutoCua/web/agent/__init__.py +35 -0
  306. autocua-0.1.0/AutoCua/web/agent/__main__.py +84 -0
  307. autocua-0.1.0/AutoCua/web/agent/main_driver/claude_prompt.md +256 -0
  308. autocua-0.1.0/AutoCua/web/agent/main_driver/fast_system_prompt.md +176 -0
  309. autocua-0.1.0/AutoCua/web/agent/main_driver/mod.rs +4 -0
  310. autocua-0.1.0/AutoCua/web/agent/main_driver/service.rs +2071 -0
  311. autocua-0.1.0/AutoCua/web/agent/main_driver/system_prompt.md +256 -0
  312. autocua-0.1.0/AutoCua/web/agent/main_driver/view.rs +824 -0
  313. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/background.js +296 -0
  314. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/element.js +1351 -0
  315. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/icon.png +0 -0
  316. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/manifest.json +32 -0
  317. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/send_button.html +282 -0
  318. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/send_button.js +27 -0
  319. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/sidepanel.html +55 -0
  320. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/sidepanel.js +53 -0
  321. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/test.command +15 -0
  322. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/test.html +74 -0
  323. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/test.js +79 -0
  324. autocua-0.1.0/AutoCua/web/browser/AutoCuaBridge/tools.js +1671 -0
  325. autocua-0.1.0/AutoCua/web/browser/bridge.rs +887 -0
  326. autocua-0.1.0/AutoCua/web/browser/bridge_test.rs +257 -0
  327. autocua-0.1.0/AutoCua/web/browser/browser.rs +5349 -0
  328. autocua-0.1.0/AutoCua/web/browser/glow/glow.css +496 -0
  329. autocua-0.1.0/AutoCua/web/browser/glow/glow.html +140 -0
  330. autocua-0.1.0/AutoCua/web/browser/glow/glow.js +1200 -0
  331. autocua-0.1.0/AutoCua/web/browser/page_tab_guard.rs +514 -0
  332. autocua-0.1.0/AutoCua/web/browser/stage_bridge.rs +242 -0
  333. autocua-0.1.0/AutoCua/web/build.rs +5 -0
  334. autocua-0.1.0/AutoCua/web/controller/click/service.rs +193 -0
  335. autocua-0.1.0/AutoCua/web/controller/dialog/service.rs +54 -0
  336. autocua-0.1.0/AutoCua/web/controller/done/service.rs +28 -0
  337. autocua-0.1.0/AutoCua/web/controller/input/service.rs +197 -0
  338. autocua-0.1.0/AutoCua/web/controller/keyboard/service.rs +289 -0
  339. autocua-0.1.0/AutoCua/web/controller/mod.rs +52 -0
  340. autocua-0.1.0/AutoCua/web/controller/run_script/guardrails_check.rs +1332 -0
  341. autocua-0.1.0/AutoCua/web/controller/run_script/service.rs +498 -0
  342. autocua-0.1.0/AutoCua/web/controller/run_script/window.rs +283 -0
  343. autocua-0.1.0/AutoCua/web/controller/scratchpad/service.rs +56 -0
  344. autocua-0.1.0/AutoCua/web/controller/scroll/service.rs +194 -0
  345. autocua-0.1.0/AutoCua/web/controller/service.rs +371 -0
  346. autocua-0.1.0/AutoCua/web/controller/skills/service.rs +214 -0
  347. autocua-0.1.0/AutoCua/web/controller/tab/service.rs +379 -0
  348. autocua-0.1.0/AutoCua/web/controller/todo_tracker/service.rs +73 -0
  349. autocua-0.1.0/AutoCua/web/controller/view.rs +561 -0
  350. autocua-0.1.0/AutoCua/web/controller/wait/service.rs +34 -0
  351. autocua-0.1.0/AutoCua/web/lib.rs +192 -0
  352. autocua-0.1.0/AutoCua/web/tool_registry/service.rs +1539 -0
  353. autocua-0.1.0/AutoCua/web/tree/element.config.json +80 -0
  354. autocua-0.1.0/AutoCua/web/tree/element.rs +2031 -0
  355. autocua-0.1.0/AutoCua/windows/agent/__init__.py +4 -0
  356. autocua-0.1.0/AutoCua/windows/agent/coder/__init__.py +4 -0
  357. autocua-0.1.0/AutoCua/windows/agent/coder/__main__.py +151 -0
  358. autocua-0.1.0/AutoCua/windows/agent/coder/claude_prompt.md +340 -0
  359. autocua-0.1.0/AutoCua/windows/agent/coder/service.py +1150 -0
  360. autocua-0.1.0/AutoCua/windows/agent/coder/system_prompt.md +340 -0
  361. autocua-0.1.0/AutoCua/windows/agent/coder/view.py +640 -0
  362. autocua-0.1.0/AutoCua/windows/agent/main_driver/__init__.py +5 -0
  363. autocua-0.1.0/AutoCua/windows/agent/main_driver/claude_prompt.md +285 -0
  364. autocua-0.1.0/AutoCua/windows/agent/main_driver/fast_system_prompt.md +208 -0
  365. autocua-0.1.0/AutoCua/windows/agent/main_driver/service.py +1398 -0
  366. autocua-0.1.0/AutoCua/windows/agent/main_driver/system_prompt.md +285 -0
  367. autocua-0.1.0/AutoCua/windows/agent/main_driver/view.py +378 -0
  368. autocua-0.1.0/AutoCua/windows/agent/minions/__init__.py +11 -0
  369. autocua-0.1.0/AutoCua/windows/agent/minions/__main__.py +132 -0
  370. autocua-0.1.0/AutoCua/windows/agent/minions/claude_prompt.md +381 -0
  371. autocua-0.1.0/AutoCua/windows/agent/minions/service.py +611 -0
  372. autocua-0.1.0/AutoCua/windows/agent/minions/system_prompt.md +381 -0
  373. autocua-0.1.0/AutoCua/windows/agent/minions/view.py +125 -0
  374. autocua-0.1.0/AutoCua/windows/agent/skills/__init__.py +4 -0
  375. autocua-0.1.0/AutoCua/windows/agent/skills/service.py +207 -0
  376. autocua-0.1.0/AutoCua/windows/controller/__init__.py +7 -0
  377. autocua-0.1.0/AutoCua/windows/controller/cli/__init__.py +4 -0
  378. autocua-0.1.0/AutoCua/windows/controller/cli/service.py +815 -0
  379. autocua-0.1.0/AutoCua/windows/controller/hotkey/__init__.py +4 -0
  380. autocua-0.1.0/AutoCua/windows/controller/hotkey/service.py +182 -0
  381. autocua-0.1.0/AutoCua/windows/controller/scratchpad/__init__.py +3 -0
  382. autocua-0.1.0/AutoCua/windows/controller/scratchpad/service.py +88 -0
  383. autocua-0.1.0/AutoCua/windows/controller/service.py +1327 -0
  384. autocua-0.1.0/AutoCua/windows/controller/task_tracker/__init__.py +4 -0
  385. autocua-0.1.0/AutoCua/windows/controller/task_tracker/service.py +128 -0
  386. autocua-0.1.0/AutoCua/windows/controller/tool/__init__.py +5 -0
  387. autocua-0.1.0/AutoCua/windows/controller/tool/browser_agent.py +244 -0
  388. autocua-0.1.0/AutoCua/windows/controller/tool/browser_agent_child.py +86 -0
  389. autocua-0.1.0/AutoCua/windows/controller/tool/interception_toggle.ps1 +141 -0
  390. autocua-0.1.0/AutoCua/windows/controller/tool/kernel_input.py +313 -0
  391. autocua-0.1.0/AutoCua/windows/controller/tool/open_app.py +409 -0
  392. autocua-0.1.0/AutoCua/windows/controller/tool/plan.py +180 -0
  393. autocua-0.1.0/AutoCua/windows/controller/tool/screenshot.py +362 -0
  394. autocua-0.1.0/AutoCua/windows/controller/tool/shell.py +115 -0
  395. autocua-0.1.0/AutoCua/windows/controller/tool/web/anthropic.py +51 -0
  396. autocua-0.1.0/AutoCua/windows/controller/tool/web/chatgpt.py +65 -0
  397. autocua-0.1.0/AutoCua/windows/controller/tool/web/google_search.py +58 -0
  398. autocua-0.1.0/AutoCua/windows/controller/tool/web/groq_search.py +52 -0
  399. autocua-0.1.0/AutoCua/windows/controller/tool/web/openrouter.py +64 -0
  400. autocua-0.1.0/AutoCua/windows/controller/tool/web/perplexity_search.py +59 -0
  401. autocua-0.1.0/AutoCua/windows/controller/tool/web/service.py +88 -0
  402. autocua-0.1.0/AutoCua/windows/controller/tool/web/web.md +24 -0
  403. autocua-0.1.0/AutoCua/windows/controller/tool/web/web_agent.py +200 -0
  404. autocua-0.1.0/AutoCua/windows/controller/view.py +1533 -0
  405. autocua-0.1.0/AutoCua/windows/remote_connection/banner.py +2595 -0
  406. autocua-0.1.0/AutoCua/windows/remote_connection/discord/service.py +1 -0
  407. autocua-0.1.0/AutoCua/windows/remote_connection/telegram/__init__.py +0 -0
  408. autocua-0.1.0/AutoCua/windows/remote_connection/telegram/service.py +1147 -0
  409. autocua-0.1.0/AutoCua/windows/remote_connection/telegram/setup.py +151 -0
  410. autocua-0.1.0/AutoCua/windows/remote_connection/telegram/telergam_animation.html +308 -0
  411. autocua-0.1.0/AutoCua/windows/remote_connection/telegram/view.py +140 -0
  412. autocua-0.1.0/AutoCua/windows/remote_connection/whatsapp/service.py +1 -0
  413. autocua-0.1.0/AutoCua/windows/sandbox/__init__.py +10 -0
  414. autocua-0.1.0/AutoCua/windows/sandbox/service.py +434 -0
  415. autocua-0.1.0/AutoCua/windows/tool_registry/__init__.py +0 -0
  416. autocua-0.1.0/AutoCua/windows/tool_registry/service.py +723 -0
  417. autocua-0.1.0/AutoCua/windows/tree/__init__.py +4 -0
  418. autocua-0.1.0/AutoCua/windows/tree/element.py +3737 -0
  419. autocua-0.1.0/AutoCua/windows/tree/ocr_detection.py +112 -0
  420. autocua-0.1.0/LICENSE +21 -0
  421. autocua-0.1.0/PKG-INFO +1238 -0
  422. autocua-0.1.0/README.md +1177 -0
  423. autocua-0.1.0/THIRD_PARTY_NOTICES.md +120 -0
  424. autocua-0.1.0/pyproject.toml +129 -0
@@ -0,0 +1,323 @@
1
+ """AutoCua package root — and the single source of truth for WHERE the user's
2
+ data lives.
3
+
4
+ User data must NOT sit inside the install folder: the Windows installer
5
+ uninstalls with `[UninstallDelete] Type: filesandordirs; Name: "{app}"`, i.e. it
6
+ deletes the WHOLE install directory, so anything written next to AutoCua.exe
7
+ (chats, API keys) died with the uninstall. Everything the user creates goes in
8
+ one folder no installer owns:
9
+
10
+ <base>/AutoCua_data/
11
+ agent_conversation/ chats: index.json, settings.json, chat_*/
12
+ api_key/api_key.txt provider keys + Telegram token + Vertex config
13
+
14
+ base = Path.home() packaged build -> C:/Users/<u>/AutoCua_data
15
+ -> /Users/<u>/AutoCua_data on macOS
16
+ base = <repo root> `python main.py` -> <repo>/AutoCua_data
17
+ base = cwd pip install -> <where you ran main.py>/AutoCua_data
18
+ (created the first time anything
19
+ asks for it)
20
+
21
+ This lives in the package root rather than in any one sub-package because six
22
+ modules across windows, mac and ios need the same answer, and two
23
+ definitions of "where is AutoCua_data" that drift apart would silently put user
24
+ data back inside the install folder — the exact bug this exists to fix.
25
+
26
+ RULES for the code below:
27
+ * stdlib ONLY, and no filesystem side effects at import time. Every
28
+ `import AutoCua.anything` executes this module first.
29
+ * NEVER print(). AutoCua re-execs itself as --banner-mode, which speaks a
30
+ JSON-per-line protocol on stdout, and sys.stdout can be None at import time
31
+ in the Windows GUI-subsystem binary. Log to `logger` (stderr) instead.
32
+ * Never use the builtin open() on a path under AutoCua_data: compiled builds
33
+ monkey-patch builtins.open to resolve embedded resources by path suffix
34
+ (frontend/service.py setup_embedded_resources), and a matching write is
35
+ silently swallowed into a StringIO. Use Path.read_bytes / write_bytes /
36
+ os.replace here.
37
+ """
38
+
39
+ import os
40
+ import sys
41
+ import logging
42
+ import threading
43
+ from pathlib import Path
44
+
45
+ logger = logging.getLogger("AutoCua.paths")
46
+
47
+ DATA_DIR_NAME = "AutoCua_data"
48
+
49
+ # Absolute-path override; wins over the rules below. The --cli-mode /
50
+ # --minion-mode / --banner-mode children are spawned with os.environ.copy(), so
51
+ # they inherit it and parent + children can never disagree on the data root.
52
+ ENV_DATA_DIR = "AutoCua_DATA_DIR"
53
+
54
+ # Compiled (Nuitka) binary vs dev run — mirrors the detection in app.py.
55
+ IS_COMPILED = bool(getattr(sys, "frozen", False)) or ("__compiled__" in globals())
56
+
57
+ # <repo>/AutoCua/__init__.py -> <repo>. __file__-based, NEVER cwd-based: the
58
+ # cli / minion children are spawned as `python -m ...` with no explicit cwd.
59
+ _REPO_ROOT = Path(__file__).resolve().parent.parent
60
+
61
+
62
+ def _home_dir() -> Path:
63
+ """The user's home. Path.home() honours USERPROFILE on Windows."""
64
+ try:
65
+ return Path.home()
66
+ except Exception:
67
+ return Path(os.path.expanduser("~"))
68
+
69
+
70
+ def _base_dir() -> Path:
71
+ """Parent folder that holds AutoCua_data/ (not created here)."""
72
+ if IS_COMPILED:
73
+ return _home_dir()
74
+ # Dev = the checkout this file lives in (main.py beside the package).
75
+ if (_REPO_ROOT / "main.py").is_file():
76
+ return _REPO_ROOT
77
+ # pip install: the package sits in site-packages, so the data goes next to
78
+ # whatever main.py the user ran — the working directory. data_root()
79
+ # creates the folder the first time it is asked for.
80
+ return Path.cwd()
81
+
82
+
83
+ def _ensure(p: Path) -> Path:
84
+ """mkdir -p, best effort. Callers already guard their own reads and writes,
85
+ so a read-only or full disk degrades to 'no data' rather than crashing the
86
+ GUI on startup."""
87
+ try:
88
+ p.mkdir(parents=True, exist_ok=True)
89
+ except Exception:
90
+ logger.exception("mkdir %s", p)
91
+ return p
92
+
93
+
94
+ def data_root() -> Path:
95
+ """<home>/AutoCua_data (packaged) or <repo>/AutoCua_data (dev)."""
96
+ # A blank/whitespace override must read as UNSET: Path("") resolves to ".",
97
+ # and callers rmtree/overwrite paths under this root.
98
+ override = (os.environ.get(ENV_DATA_DIR) or "").strip()
99
+ root = Path(override).expanduser() if override else _base_dir() / DATA_DIR_NAME
100
+ if not override:
101
+ # Pin it for every child (cli / minion / parallel tasks are spawned
102
+ # with os.environ.copy()), so a child started with another cwd can
103
+ # never end up with its own AutoCua_data.
104
+ os.environ[ENV_DATA_DIR] = str(root.resolve())
105
+ return _ensure(root)
106
+
107
+
108
+ BROWSER_PROFILES_DIR = "browser_profiles"
109
+ DEFAULT_BROWSER_PROFILE = "default"
110
+
111
+
112
+ def normalize_profile_name(name) -> str:
113
+ """A browser profile name, or ValueError.
114
+
115
+ The name becomes a path segment under `data_root()`, which is a tree this
116
+ codebase deletes from — so this REJECTS rather than sanitizes. Quietly
117
+ mapping "../../etc" to "etc" would be worse than an error: it would delete
118
+ or overwrite something the caller never named.
119
+ """
120
+ text = str(name or "").strip().lower()
121
+ if not text:
122
+ return DEFAULT_BROWSER_PROFILE
123
+ if len(text) > 64 or text.startswith("."):
124
+ raise ValueError(f"browser profile name {text!r} must be 1-64 chars and not start with '.'")
125
+ if any(c not in "abcdefghijklmnopqrstuvwxyz0123456789._-" for c in text):
126
+ raise ValueError(
127
+ f"browser profile name {text!r} may only contain letters, digits, '.', '_' and '-'"
128
+ )
129
+ if text in ("_tmp", ".", ".."):
130
+ raise ValueError(f"browser profile name {text!r} is reserved")
131
+ return text
132
+
133
+
134
+ def browser_profile_dir(name=None, browser=None) -> Path:
135
+ """The user-data-dir for a named browser profile, created if absent.
136
+
137
+ <data_root>/browser_profiles/<name>/<browser>
138
+
139
+ `browser` is "chrome" (the agent's browser) unless named. The browser
140
+ owns and litters its user-data-dir, so it is nested one level down: that
141
+ leaves room beside it for our own files and makes "reset this profile" a
142
+ delete of one folder rather than of the profile's identity. A normal run
143
+ drives the person's own Chrome through the AutoCua extension and never
144
+ comes here; this folder is for the headless and parallel runs, which have
145
+ a browser of their own on a debugging port.
146
+
147
+ This is what makes the agent arrive already logged in. Cookies,
148
+ localStorage and IndexedDB live in here and survive between runs, so a site
149
+ the agent signed into once does not have to be signed into again — which
150
+ matters far more than any fingerprint tuning, because a login wall is where
151
+ a web agent usually stops.
152
+ """
153
+ if browser is None:
154
+ browser = "chrome"
155
+ root = data_root() / BROWSER_PROFILES_DIR / normalize_profile_name(name)
156
+ _ensure(root)
157
+ return _ensure(root / browser)
158
+
159
+
160
+ def install_dir() -> Path:
161
+ """Where the app's own code sits — the folder the uninstaller deletes. Used
162
+ only to find data left behind by a pre-AutoCua_data build."""
163
+ return Path(sys.executable).resolve().parent if IS_COMPILED else _REPO_ROOT
164
+
165
+
166
+ # =============================================================================
167
+ # skills — the .md knowledge files
168
+ # =============================================================================
169
+ # Two folders, same layout (skills.json + *.md), read together by every
170
+ # DomainKnowledgeService:
171
+ # AutoCua/default_skills/<windows|mac|ios>/ the defaults shipped with the
172
+ # package (read-only, tracked)
173
+ # AutoCua_data/skills/<windows|mac|ios>/ the user's own skills, added
174
+ # from the UI or by hand
175
+ # Nothing is ever copied from one to the other. A name is loaded once: the
176
+ # default first, then the user folder; a file missing from both is ignored.
177
+ # NOTE: `plat` IS the package name (AutoCua/{mac,windows,linux,ios}), so no map.
178
+
179
+ DEFAULT_SKILLS_DIR = "default_skills"
180
+
181
+
182
+ def skills_platform(value=None) -> str:
183
+ """'windows' | 'mac' | 'linux' | 'ios'. Accepts sys.platform or a package
184
+ name. iOS is driven from a Mac, so it is never the host default - only an
185
+ explicit "ios" selects its folder."""
186
+ key = str(sys.platform if value is None else value).lower()
187
+ if key == "ios":
188
+ return "ios"
189
+ if "darwin" in key or "mac" in key:
190
+ return "mac"
191
+ if "linux" in key:
192
+ return "linux"
193
+ return "windows"
194
+
195
+
196
+ def _skills_from_dir(src: Path) -> dict:
197
+ out = {}
198
+ if src.is_dir():
199
+ for p in sorted(src.iterdir()):
200
+ if p.is_file() and (p.suffix.lower() == ".md" or p.name == "skills.json"):
201
+ try:
202
+ out[p.name] = p.read_text(encoding="utf-8")
203
+ except Exception:
204
+ logger.warning("unreadable default skill %s", p)
205
+ return out
206
+
207
+
208
+ def _skills_from_resources(prefix: str) -> dict:
209
+ """Pull skill files out of the binary's embedded-resource blobs. Keys are
210
+ repo-root-relative with forward slashes, e.g.
211
+ 'AutoCua/default_skills/windows/browser.md'."""
212
+ out = {}
213
+ try:
214
+ import base64
215
+ from _embedded_resources import RESOURCES # generated by the binary build
216
+ except Exception:
217
+ return out
218
+ for key, blob in RESOURCES.items():
219
+ k = str(key).replace("\\", "/")
220
+ i = k.find(prefix)
221
+ name = k[i + len(prefix):] if i >= 0 else ""
222
+ if name and "/" not in name and (name.endswith(".md") or name == "skills.json"):
223
+ try:
224
+ out[name] = base64.b64decode(blob).decode("utf-8")
225
+ except Exception:
226
+ logger.warning("undecodable embedded skill %s", key)
227
+ return out
228
+
229
+
230
+ def default_skills_dir(platform=None) -> Path:
231
+ """AutoCua/default_skills/<windows|mac|linux|ios> — the shipped defaults.
232
+ Read-only; may not exist on disk in a compiled build (see default_skills)."""
233
+ return Path(__file__).resolve().parent / DEFAULT_SKILLS_DIR / skills_platform(platform)
234
+
235
+
236
+ def default_skills(platform=None) -> dict:
237
+ """{filename: text} of the shipped default skills for the platform
238
+ (skills.json + *.md). In a compiled build they arrive as embedded blobs;
239
+ otherwise they are read straight off the package directory."""
240
+ plat = skills_platform(platform)
241
+ return (_skills_from_resources("AutoCua/%s/%s/" % (DEFAULT_SKILLS_DIR, plat))
242
+ or _skills_from_dir(default_skills_dir(plat)))
243
+
244
+
245
+ def skills_dir(platform=None) -> Path:
246
+ """AutoCua_data/skills/<windows|mac|linux|ios> — the user's own skills, created
247
+ empty on first use. The defaults are never copied here."""
248
+ return _ensure(data_root() / "skills" / skills_platform(platform))
249
+
250
+
251
+ def vault_file() -> Path:
252
+ """AutoCua_data/vault/credentials.json — the app's saved credentials.
253
+
254
+ Created empty ({}) if absent, so the folder is discoverable and the user has
255
+ an obvious file to fill in. Lives outside the install folder like everything
256
+ else here, so an uninstall can't take the credentials with it."""
257
+ p = _ensure(data_root() / "vault") / "credentials.json"
258
+ if not p.exists():
259
+ try:
260
+ # write_text -> io.open, so the compiled build's builtins.open patch
261
+ # can't swallow the write into a throwaway buffer.
262
+ p.write_text("{}", encoding="utf-8")
263
+ except Exception:
264
+ logger.exception("create %s", p)
265
+ return p
266
+
267
+
268
+ # =============================================================================
269
+ # api_key.txt — provider keys, the Telegram bot token, and Vertex config
270
+ # =============================================================================
271
+ # Every consumer must agree on this ONE path, or the Settings panel writes a key
272
+ # the agent can't read. Before this moved there were three different answers in
273
+ # the tree: frontend/service.py and windows/llm_provider walked up to
274
+ # AutoCua/api_key/ (right), while mac and ios llm_provider stopped one
275
+ # level short at <pkg>/api_key/ (a folder that never existed, so Vertex config
276
+ # silently read back empty on those platforms). One function, one answer.
277
+ _api_key_migrated = False
278
+ _api_key_lock = threading.Lock()
279
+
280
+
281
+ def api_key_file() -> Path:
282
+ """AutoCua_data/api_key/api_key.txt, migrating a pre-AutoCua_data copy on
283
+ the first call in each process. Idempotent and never raises."""
284
+ path = _ensure(data_root() / "api_key") / "api_key.txt"
285
+ _migrate_legacy_api_key(path)
286
+ return path
287
+
288
+
289
+ def _migrate_legacy_api_key(dest: Path) -> None:
290
+ """Move AutoCua/api_key/api_key.txt out of the install folder, once.
291
+
292
+ Crash-safe by construction: the copy is staged as '<dest>.part' and renamed
293
+ into place (atomic within the folder), and the legacy file is unlinked only
294
+ after the rename succeeds. Skip-if-destination-exists makes a re-run a no-op
295
+ and means the newer file always wins, so a downgrade/upgrade round trip can
296
+ never overwrite live keys with stale ones."""
297
+ global _api_key_migrated
298
+ if _api_key_migrated or dest.exists():
299
+ return
300
+ with _api_key_lock:
301
+ if _api_key_migrated or dest.exists():
302
+ return
303
+ try:
304
+ legacy = install_dir() / "AutoCua" / "api_key" / "api_key.txt"
305
+ if not legacy.is_file() or legacy.resolve() == dest.resolve():
306
+ return
307
+ # Path.read_bytes/write_bytes go through io.open, which the compiled
308
+ # build's builtins.open patch does NOT replace.
309
+ part = dest.with_name(dest.name + ".part")
310
+ part.write_bytes(legacy.read_bytes())
311
+ os.replace(str(part), str(dest))
312
+ try:
313
+ legacy.unlink()
314
+ legacy.parent.rmdir() # only succeeds if now empty
315
+ except OSError:
316
+ pass
317
+ logger.info("migrated api_key.txt: %s -> %s", legacy, dest)
318
+ except Exception:
319
+ logger.exception("migrate legacy api_key.txt")
320
+ finally:
321
+ # Set even on failure so we don't re-scan on every call; the next
322
+ # app start retries from scratch.
323
+ _api_key_migrated = True
@@ -0,0 +1,12 @@
1
+ """Permanent (resumable) chat memory for the UI path.
2
+
3
+ All conversation-memory management lives in this package — saving, loading and
4
+ optimizing a session's conversation, and the on-disk session folders + index.
5
+ The agent stays a thin one-shot loop; app.py talks ONLY to ConversationService
6
+ (load a session -> trigger the main agent -> save the run). main.py / cli.py
7
+ never import this package, so they remain direct one-shot entry points.
8
+ """
9
+
10
+ from .service import ConversationService, conversation
11
+
12
+ __all__ = ["ConversationService", "conversation"]