ksaa 2025.6.23.0__py3-none-any.whl → 2025.6.28.0__py3-none-any.whl

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 (167) hide show
  1. kotonebot/backend/context/context.py +0 -2
  2. kotonebot/client/__init__.py +1 -2
  3. kotonebot/client/device.py +155 -4
  4. kotonebot/client/host/adb_common.py +94 -0
  5. kotonebot/client/host/custom.py +27 -21
  6. kotonebot/client/host/leidian_host.py +14 -23
  7. kotonebot/client/host/mumu12_host.py +70 -24
  8. kotonebot/client/host/protocol.py +4 -1
  9. kotonebot/client/host/windows_common.py +55 -0
  10. kotonebot/client/implements/__init__.py +2 -1
  11. kotonebot/client/implements/adb.py +1 -44
  12. kotonebot/client/implements/adb_raw.py +2 -9
  13. kotonebot/client/implements/nemu_ipc/__init__.py +8 -0
  14. kotonebot/client/implements/nemu_ipc/external_renderer_ipc.py +280 -0
  15. kotonebot/client/implements/nemu_ipc/nemu_ipc.py +327 -0
  16. kotonebot/client/implements/remote_windows.py +8 -14
  17. kotonebot/client/implements/uiautomator2.py +5 -16
  18. kotonebot/client/implements/windows.py +5 -36
  19. kotonebot/client/registration.py +2 -67
  20. kotonebot/config/base_config.py +4 -2
  21. kotonebot/debug_entry.py +4 -2
  22. kotonebot/errors.py +7 -0
  23. kotonebot/kaa/main/dmm_host.py +13 -32
  24. kotonebot/kaa/main/gr.py +114 -27
  25. kotonebot/kaa/main/kaa.py +30 -3
  26. kotonebot/kaa/metadata.py +32 -0
  27. kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  28. kotonebot/kaa/tasks/R.py +132 -132
  29. {ksaa-2025.6.23.0.dist-info → ksaa-2025.6.28.0.dist-info}/METADATA +4 -1
  30. {ksaa-2025.6.23.0.dist-info → ksaa-2025.6.28.0.dist-info}/RECORD +167 -162
  31. /kotonebot/kaa/sprites/{7f6cb60e-6ab3-4db4-86e1-8558250062a4.png → 019273c4-22ce-486f-8a7d-dbc78f13dcac.png} +0 -0
  32. /kotonebot/kaa/sprites/{bb0ae68d-44d5-47c6-91dd-a529bc34225b.png → 03e34ef7-36b5-4ddc-9545-5b70a2eba72e.png} +0 -0
  33. /kotonebot/kaa/sprites/{faf360e8-7845-4fcf-b0a6-0f5f93c050f1.png → 06ea773b-e2b3-40d4-82f6-b119ce9ca00b.png} +0 -0
  34. /kotonebot/kaa/sprites/{2f74b04f-1992-4584-8dc6-e789b081ddc3.png → 0769f8f4-1c47-4bad-a783-bba5e20250bf.png} +0 -0
  35. /kotonebot/kaa/sprites/{58a5f51d-d1a3-480b-8dde-ecead34d9f02.png → 08946997-4e9e-4242-95e1-e988fa96b919.png} +0 -0
  36. /kotonebot/kaa/sprites/{694d3a07-9697-4bda-984d-967779d530f7.png → 0d60ce10-20ce-4980-8172-b6bac08d6258.png} +0 -0
  37. /kotonebot/kaa/sprites/{1b6be6dd-2711-441a-9fa6-3281a6ad10c7.png → 0f40352f-6443-406e-8e2c-c40d5cfc6c59.png} +0 -0
  38. /kotonebot/kaa/sprites/{94433cf2-dd04-4b74-ae14-e5e3d945f579.png → 0f6d7f89-bdb2-4235-9b6b-e65cb73a4167.png} +0 -0
  39. /kotonebot/kaa/sprites/{9f99b0e9-8cc0-4877-8f8a-d26257ef5386.png → 14d09c44-3897-4c81-b615-19c35d0f3793.png} +0 -0
  40. /kotonebot/kaa/sprites/{b5d4265c-82e0-470d-a48e-8aa4edbdef5a.png → 15191dec-7e33-4721-8068-15c11978e885.png} +0 -0
  41. /kotonebot/kaa/sprites/{42d8b5dc-ef27-4411-b8b5-d981e562990b.png → 15f8f31e-65ce-408d-8556-b799bcefc9d4.png} +0 -0
  42. /kotonebot/kaa/sprites/{d1699baa-467b-46d1-9276-aae78fe8f589.png → 20b01af5-907b-4d49-9f5b-a3700ca9c0c3.png} +0 -0
  43. /kotonebot/kaa/sprites/{faf069e1-f623-47c1-b879-cfa246fbc7df.png → 242c088b-bc73-4d11-aa31-ee7c71477fb4.png} +0 -0
  44. /kotonebot/kaa/sprites/{c25c7ce5-ad8d-4b2c-83eb-ae6d4871a6c3.png → 2f2a7951-a30a-4835-b9f6-3205cfdd2f05.png} +0 -0
  45. /kotonebot/kaa/sprites/{aefdec38-e3b6-4762-aed8-33107686ddac.png → 3031397e-3d12-4f23-8377-006eca5d2627.png} +0 -0
  46. /kotonebot/kaa/sprites/{ed6d3e3d-0f04-4fa4-b0f9-fdbf324649f6.png → 312dbd82-5457-474a-91ce-511f0e4e9c80.png} +0 -0
  47. /kotonebot/kaa/sprites/{c571e1c0-ff85-4b2e-97ed-97d33b8d92e3.png → 31851ad1-df39-4a4f-9ae7-19c1d1c6b51a.png} +0 -0
  48. /kotonebot/kaa/sprites/{c484ca57-6b19-46b5-a107-1805a7488d48.png → 338b699a-d556-4b80-a577-123442c3db45.png} +0 -0
  49. /kotonebot/kaa/sprites/{920a3974-4875-4d2b-bbac-caa175c03ce0.png → 35319890-98e3-4f75-b969-6b8576ef668d.png} +0 -0
  50. /kotonebot/kaa/sprites/{f8eec9b2-55ca-4195-b098-a5393d02a98a.png → 3536f829-70d3-48f9-8fd4-b65eab7502f3.png} +0 -0
  51. /kotonebot/kaa/sprites/{97adee05-1586-4589-93e6-c6c3a9cdae9d.png → 35516b69-a4f4-4ad4-8af4-35043475ee90.png} +0 -0
  52. /kotonebot/kaa/sprites/{c5ea3dfd-6761-466e-b44c-86592ef05323.png → 36d71d33-09c9-4be8-b184-ccf40f700333.png} +0 -0
  53. /kotonebot/kaa/sprites/{dbd537c7-d1d3-4d64-9ccd-43dd4519bedd.png → 379d5084-637f-45e8-8bd8-789eaa919821.png} +0 -0
  54. /kotonebot/kaa/sprites/{29cb7b0f-5684-4516-8fae-4439f7f28e08.png → 3851303a-e3a0-46eb-aa7e-b47fb41946f7.png} +0 -0
  55. /kotonebot/kaa/sprites/{25910d8e-d57f-409f-b0be-ee68c5af4920.png → 3d1aa368-e198-478f-a47f-49818efbaec8.png} +0 -0
  56. /kotonebot/kaa/sprites/{cb24b3df-1ec3-4ffd-95f1-ca4b0dd5b7da.png → 3f5907a9-7fe4-4f46-8e46-a96ac7fa3923.png} +0 -0
  57. /kotonebot/kaa/sprites/{c5e16f75-9b5a-4853-a144-275f3d20c186.png → 40c0f296-d29e-4e05-aaff-a212339b742e.png} +0 -0
  58. /kotonebot/kaa/sprites/{5d3d61e9-bf13-4668-b0c7-fed730ea2ed6.png → 43e72796-a644-4d9b-a817-8add011d9a75.png} +0 -0
  59. /kotonebot/kaa/sprites/{9c7f1bcc-0bc8-454b-95fb-56a803030771.png → 469c2b41-4171-4902-acc5-da0c807886ab.png} +0 -0
  60. /kotonebot/kaa/sprites/{65d2a5e5-48aa-4390-bb87-bfd8e044e4f6.png → 497e7930-f423-457a-8168-b1a1532bb1e9.png} +0 -0
  61. /kotonebot/kaa/sprites/{0ad2f603-a3ad-4a92-a398-c411145fd8e9.png → 49a43af3-17e3-4434-ba4d-519775ccaea9.png} +0 -0
  62. /kotonebot/kaa/sprites/{bfec58df-2628-454f-92aa-769cad186448.png → 49b9a298-e847-4322-99a2-c0588c3542fe.png} +0 -0
  63. /kotonebot/kaa/sprites/{a3b15425-0bfd-4668-a3a9-2ab64da8505f.png → 4a1902aa-01db-46bb-bea5-88ac62c82562.png} +0 -0
  64. /kotonebot/kaa/sprites/{66172bc0-3869-4a48-a26d-0dc3fa404ab8.png → 4a96a728-6303-4ae3-8e0c-9f1e8e5f86a7.png} +0 -0
  65. /kotonebot/kaa/sprites/{8b9c115b-d4ce-492e-88cb-08bd01c43570.png → 4b7c4221-a679-47f6-929d-0ef514894b27.png} +0 -0
  66. /kotonebot/kaa/sprites/{0d4b669e-5e43-4458-b65a-5565797335ae.png → 4d355e36-9169-43e4-bd58-2836ee3e56e0.png} +0 -0
  67. /kotonebot/kaa/sprites/{969eb98c-f761-4007-b8bd-2b3fb8d1f08c.png → 4eb97d68-cd47-4100-9c3b-35b5c86b4bdf.png} +0 -0
  68. /kotonebot/kaa/sprites/{eae83523-e58c-4db9-a356-4335a5da3dc8.png → 515a2ff0-36b8-4f2f-9902-e6c1b9796586.png} +0 -0
  69. /kotonebot/kaa/sprites/{9aef1aa8-41e1-42a7-83ad-b4e212ee3976.png → 51a3ed29-92b9-4429-9e50-783d1b8dc6a7.png} +0 -0
  70. /kotonebot/kaa/sprites/{83f17b06-2792-4035-bc90-1800279ae131.png → 52d3438b-afae-4c7a-abe5-7ed530c7558c.png} +0 -0
  71. /kotonebot/kaa/sprites/{9d5dd50c-3341-41a4-a3dd-ccc00edcf201.png → 540ee3b5-ca8f-4091-80a6-ce774d95e5f7.png} +0 -0
  72. /kotonebot/kaa/sprites/{17a8b0a5-5b71-4612-8a68-16c51f03c71b.png → 54a15298-ecaf-4cc5-b8a2-5b0d8f8add41.png} +0 -0
  73. /kotonebot/kaa/sprites/{7cabdf91-2f15-4991-b165-eb9cdd557af6.png → 554c0ff6-0a05-419d-85f9-5ced260d0d2e.png} +0 -0
  74. /kotonebot/kaa/sprites/{bed9575d-ccad-4f4e-825e-47b2a9cb0925.png → 55e4ef75-ba8e-4230-819c-450cf14b08cd.png} +0 -0
  75. /kotonebot/kaa/sprites/{4e8f3e59-edfa-4523-939d-bc46988fc909.png → 5824ef5f-6776-402c-b78c-ae79cc4cc878.png} +0 -0
  76. /kotonebot/kaa/sprites/{1ccdcacf-4f7d-442c-8e2f-09aa7fe14e56.png → 5a393483-c631-47fd-805c-c460c23b8f9e.png} +0 -0
  77. /kotonebot/kaa/sprites/{ba759205-ce99-4417-8cab-d32fe55dff4c.png → 5b75cae4-a853-402c-acec-edbfef94342a.png} +0 -0
  78. /kotonebot/kaa/sprites/{a1853223-d6b9-4660-af4e-91e59bdddc3c.png → 5c9ae62c-488f-4109-a4d2-d2385c32043d.png} +0 -0
  79. /kotonebot/kaa/sprites/{f72bd3d6-850d-4190-9775-938f474d263c.png → 5cdd71be-c8cd-4310-b6f4-5e97ddbeb46e.png} +0 -0
  80. /kotonebot/kaa/sprites/{4eaa5db2-d624-4df4-b2e4-01f72755f1a4.png → 5d5cb13b-c1fd-4808-b352-b21291a9ff0b.png} +0 -0
  81. /kotonebot/kaa/sprites/{52f7c8b1-af88-43c5-a999-de4da3caa03a.png → 5d6c4462-3d7c-42eb-ab3e-195ebf845a09.png} +0 -0
  82. /kotonebot/kaa/sprites/{7aa2435c-da90-4d52-b831-88dbec57dde9.png → 5d94e628-82ff-4531-b70a-b13297491bea.png} +0 -0
  83. /kotonebot/kaa/sprites/{0fbcb3f6-9ca0-43c7-975b-e7c15c26c897.png → 5dc2dca3-48bd-4eee-af89-1a1d30593bd5.png} +0 -0
  84. /kotonebot/kaa/sprites/{f611bbd9-c062-4989-96a4-65ff6c59673c.png → 5f0c2a57-efd0-4094-9f71-6f6fe97316f6.png} +0 -0
  85. /kotonebot/kaa/sprites/{d5d854fc-1b87-43d4-b32d-66eccb66fa41.png → 610348f2-6262-4cd1-8fc3-e7470f85580c.png} +0 -0
  86. /kotonebot/kaa/sprites/{a8b3fdce-9e4a-495c-839e-0142f67fee69.png → 613e9b10-b2eb-44ea-b6d9-9310c0e1bdcf.png} +0 -0
  87. /kotonebot/kaa/sprites/{aa3b717f-67f8-445f-a6bf-b89f7200d95b.png → 618b21ad-ab8b-436a-8eb8-bd320a198c9f.png} +0 -0
  88. /kotonebot/kaa/sprites/{7516c9a1-87ec-4d2f-ac5e-40d1aec27104.png → 61a09df6-7443-436c-9ef0-1d5a1cae1509.png} +0 -0
  89. /kotonebot/kaa/sprites/{0235ae3d-1741-4a81-8053-f60bc395ee85.png → 64be274e-e8ad-4938-84c1-5d8aabcd10d8.png} +0 -0
  90. /kotonebot/kaa/sprites/{b01c25d2-21bf-4db9-b5b2-ec35817f1b04.png → 671b4a55-023a-434d-b29a-e844fe528e6b.png} +0 -0
  91. /kotonebot/kaa/sprites/{302fde7d-de85-44c7-ba57-fe4b5f6db5fa.png → 6e5e9cf9-80b0-4241-a222-ff50dbd89a0c.png} +0 -0
  92. /kotonebot/kaa/sprites/{080b3cf5-ce35-4382-9bfa-d6a12efb09b3.png → 6ef59649-bbb3-42b6-a6b0-eac4f35a3da4.png} +0 -0
  93. /kotonebot/kaa/sprites/{15465879-eb84-4ca6-ae0f-d3c5ac71e723.png → 75a2093d-8743-427e-8d24-ae9a69fa14c1.png} +0 -0
  94. /kotonebot/kaa/sprites/{e5eeb9af-8003-4981-bf56-2e32e76cec5d.png → 76bde19a-4b1b-4e52-86d9-f56be7529c71.png} +0 -0
  95. /kotonebot/kaa/sprites/{1bb00a74-2fdc-4973-84ae-dc1edee15f81.png → 77d06f4d-8214-4306-9dc5-035c720f7256.png} +0 -0
  96. /kotonebot/kaa/sprites/{efb28e1d-7b52-4e20-aec5-117c798b7fbe.png → 78b642d3-9a2c-4c17-8872-3cc78211f4a0.png} +0 -0
  97. /kotonebot/kaa/sprites/{cdbbb5ba-5117-488a-8172-48cfc92c14c6.png → 7a9d1c39-b306-4cb0-be2f-7a5963099949.png} +0 -0
  98. /kotonebot/kaa/sprites/{f6bfbf6a-6e53-4563-9345-3f3756d6ea9a.png → 7ddda828-c8b0-4331-864f-99b85b7c5557.png} +0 -0
  99. /kotonebot/kaa/sprites/{b1e7f24e-f246-406e-9073-58e2f3e4e819.png → 81399fd9-f254-4d0e-9775-ad451c237a4e.png} +0 -0
  100. /kotonebot/kaa/sprites/{5152e3fa-079c-4592-8df7-656101694df8.png → 81526e97-1b8d-433f-a5c9-907e4e8c85cd.png} +0 -0
  101. /kotonebot/kaa/sprites/{09fb5e41-6caa-4246-a415-8317b12d8d81.png → 818e2370-8fb9-4e6c-ab78-58e86d6525b5.png} +0 -0
  102. /kotonebot/kaa/sprites/{0a6c6b1e-7a80-428e-a483-1858bfb8ac59.png → 8431cc52-0041-4425-808c-dcd4d196506c.png} +0 -0
  103. /kotonebot/kaa/sprites/{6aa34982-e7ab-4001-808f-8c5cf370d087.png → 85a49ff3-6075-4797-8b7f-35851a843698.png} +0 -0
  104. /kotonebot/kaa/sprites/{f528ea0e-1e55-4e41-844f-bb1db9185ef8.png → 86062e91-d6c1-44cf-9f8c-26a8b9dd8686.png} +0 -0
  105. /kotonebot/kaa/sprites/{26580772-ff20-4dcf-8496-f939e0f2890d.png → 860c3d98-e263-482f-95fb-4fc9c472e8b8.png} +0 -0
  106. /kotonebot/kaa/sprites/{a1bba683-a740-4eaf-8c37-3b1042b963b0.png → 8669ce44-dec7-47c2-aafd-3f2fbfd1d083.png} +0 -0
  107. /kotonebot/kaa/sprites/{8e48af2b-c083-4480-a27c-c59c31a7ede1.png → 86b15801-c932-4034-bed8-fd76b0f65916.png} +0 -0
  108. /kotonebot/kaa/sprites/{3cc9685d-6347-4114-9d39-7683c2dc9df6.png → 893b015d-6894-4e74-880e-d22859a25662.png} +0 -0
  109. /kotonebot/kaa/sprites/{66678caa-7b25-4ff7-8c3a-017f67279349.png → 8c0fa5fa-cebb-4ae7-bd1c-b542c9cbf694.png} +0 -0
  110. /kotonebot/kaa/sprites/{e9c45a73-2011-4584-87b7-c4e566eba87f.png → 913a1d17-54fe-4c8f-ac50-ef7f39600b86.png} +0 -0
  111. /kotonebot/kaa/sprites/{d60a395b-d907-416a-b091-36bfee4948b3.png → 964c6b90-f526-4199-9523-d8124373a56b.png} +0 -0
  112. /kotonebot/kaa/sprites/{69b022a8-e42f-4985-bd16-b4a530ad8a20.png → 97c281a9-ebb0-4f54-b644-b7ed7dd65f81.png} +0 -0
  113. /kotonebot/kaa/sprites/{b65724b4-ec8f-48a9-9ab2-e7ce5b8f35b2.png → 998fc84a-af71-4fa5-8aa4-e0bfeb9c53ea.png} +0 -0
  114. /kotonebot/kaa/sprites/{b8aada91-eedd-4c53-99f3-f903d547235e.png → 9cbf7f6e-fe77-463b-9c60-495dc823510a.png} +0 -0
  115. /kotonebot/kaa/sprites/{038c69e6-7cb0-4c8d-99da-b537e48a86b7.png → 9ce7d48e-295d-47b2-96eb-f3ce697c1b37.png} +0 -0
  116. /kotonebot/kaa/sprites/{cf66ae12-48bc-4512-a988-0e5de337c76d.png → 9dcca89b-c92b-4708-8f19-facd40d09a65.png} +0 -0
  117. /kotonebot/kaa/sprites/{264e056f-3bcc-4b16-94d4-f767c78ab6f5.png → 9e369992-ea8c-4c15-88d3-1344319978b0.png} +0 -0
  118. /kotonebot/kaa/sprites/{1aaceb21-dc5c-4a58-96d3-d2c66b2fb357.png → 9f9003ba-468f-406f-a82f-1b7a23ef347c.png} +0 -0
  119. /kotonebot/kaa/sprites/{1639278d-67e0-4452-a2b5-ec4cf4011f42.png → a2bf4e11-fbc3-4172-bc0b-b16f8f59e68c.png} +0 -0
  120. /kotonebot/kaa/sprites/{4a310bdd-0a7d-4669-9d57-6ae69bc8f022.png → a546e254-0490-43df-a291-a9a5c2b4c34a.png} +0 -0
  121. /kotonebot/kaa/sprites/{abcc709c-1f4d-4832-a063-eafbad94ac31.png → aacd229c-d307-4a20-a388-84d8f4afb4a5.png} +0 -0
  122. /kotonebot/kaa/sprites/{84bb4986-0295-4a45-9486-86e31fcdf1f1.png → b003bef5-53db-4032-b1bd-d5075de365a8.png} +0 -0
  123. /kotonebot/kaa/sprites/{d4c47cc7-5b3e-4c3e-8e80-78cb94e7eed9.png → b641a122-4734-43e1-b22f-468464a0cff1.png} +0 -0
  124. /kotonebot/kaa/sprites/{83acbca8-3567-4262-a1e7-50f158348d45.png → bc7303f3-43e9-4ece-9206-5f9c779b813b.png} +0 -0
  125. /kotonebot/kaa/sprites/{534d1310-3503-46d3-8ecd-426d9bcf183e.png → bd7a6754-fffc-4315-987f-5ba32d95b697.png} +0 -0
  126. /kotonebot/kaa/sprites/{8f1e5644-1079-44b1-9d44-97bae3817bc5.png → c39f2006-442b-4ab7-99bb-3dfa0673f05d.png} +0 -0
  127. /kotonebot/kaa/sprites/{f025027f-daa0-4943-8395-5d7d44cc7f15.png → c70f4634-6821-4480-a615-b5f9cdc578c1.png} +0 -0
  128. /kotonebot/kaa/sprites/{a7da51c2-8444-4770-a16b-b6543e40197f.png → c774098e-d782-455c-80a9-5bad3713129d.png} +0 -0
  129. /kotonebot/kaa/sprites/{60be53a6-98e9-4fc6-9285-85506dc0e335.png → c7e3736a-0e0f-474a-9386-f58292a45b92.png} +0 -0
  130. /kotonebot/kaa/sprites/{d3e6e2e9-c5b5-463f-98f4-de72c9320d9d.png → c90b582c-8570-48b4-98c0-62d5b067ca2c.png} +0 -0
  131. /kotonebot/kaa/sprites/{5868ebfb-5e61-4ac6-b270-acb1e89b738f.png → c9d3699b-c8b1-4294-9b48-103df4ab6c65.png} +0 -0
  132. /kotonebot/kaa/sprites/{17414e9e-b046-49e0-9596-cad1f4673a9e.png → cc9483c3-c895-4dcc-b3f2-0934ba1ad42e.png} +0 -0
  133. /kotonebot/kaa/sprites/{dad4ff8c-07f4-4b07-abd3-5d02bbcc4562.png → cec49286-3d48-4fe0-8911-6a1b17d1ac20.png} +0 -0
  134. /kotonebot/kaa/sprites/{7b7dad18-a838-4267-b3c7-6ab43b8361f0.png → cef78712-d9ae-4d6e-8d7d-d047d48fbb98.png} +0 -0
  135. /kotonebot/kaa/sprites/{ad172750-d1a6-4a25-8ce8-9483f4b5affb.png → d06fd859-4678-4593-b096-c86b38810cb7.png} +0 -0
  136. /kotonebot/kaa/sprites/{448ea37d-a10d-4102-ac9f-a58403ee8914.png → d19c37ff-d5c1-4316-8424-e69ccb5c2523.png} +0 -0
  137. /kotonebot/kaa/sprites/{ca2adfb8-1e88-4a31-b3cc-1f70568ce4a3.png → d26b60f7-d15c-4563-bedc-dd6e7e4078b2.png} +0 -0
  138. /kotonebot/kaa/sprites/{a1cf80ee-64bf-4d54-a7db-ffadf3c97026.png → d26bf52c-cb1b-4ebf-9c03-ff3f2d245959.png} +0 -0
  139. /kotonebot/kaa/sprites/{2dd34393-ee6f-4b19-8a9c-76556d1bd7d7.png → d5fd6c73-4ad8-47b5-89be-c7b137a9950f.png} +0 -0
  140. /kotonebot/kaa/sprites/{4b20b364-5f5f-4b34-960e-b0cfd08b1662.png → d696062b-9b58-4af1-835e-2cf5a0a0fbeb.png} +0 -0
  141. /kotonebot/kaa/sprites/{e1e0d751-9006-4fa4-a933-4c0dc5e1f3d2.png → da7a329e-339e-4ee7-8775-bca505a1980d.png} +0 -0
  142. /kotonebot/kaa/sprites/{dde03640-6c3a-4b13-a783-f672816bfec4.png → dedb8499-5881-4add-914f-ff0049285dae.png} +0 -0
  143. /kotonebot/kaa/sprites/{83cf48ba-d1af-4674-a52e-6bb80a626db7.png → dedea21b-f21d-4621-a213-70ad03faec58.png} +0 -0
  144. /kotonebot/kaa/sprites/{e394ff91-09d3-41e1-bbf5-bc42a71a623b.png → dff74cce-ba2d-44aa-b924-183259080a32.png} +0 -0
  145. /kotonebot/kaa/sprites/{f12c2b0b-8273-4197-a8c6-2a8ef2788a9b.png → e0246b0d-f0cf-49d4-8423-7da46e75a575.png} +0 -0
  146. /kotonebot/kaa/sprites/{1f2981d8-5eb6-4332-aa9b-17f4db2d4163.png → e1b6b32b-c797-4f1d-aa2b-e7320083a9a6.png} +0 -0
  147. /kotonebot/kaa/sprites/{6114d53e-dd69-4cee-82a7-7e43b338ff8d.png → e23e3f19-03f6-4507-9128-115191272b90.png} +0 -0
  148. /kotonebot/kaa/sprites/{90def878-cd6e-46e5-9dc4-9c92dd904b80.png → e2eb3bae-6451-40b9-bbff-90f11dca1904.png} +0 -0
  149. /kotonebot/kaa/sprites/{1d5f7454-672d-4e87-a368-ec4bb32f9b1f.png → e46e1b6d-6702-46bf-a07e-aec8d183453f.png} +0 -0
  150. /kotonebot/kaa/sprites/{e5259dfb-3a49-4cfc-9f89-b42958ce6eec.png → e5297036-9934-44a4-a761-a6a49ae06e3e.png} +0 -0
  151. /kotonebot/kaa/sprites/{2d145ade-b926-4276-b872-baec4ef78308.png → e7da5988-0e83-44ad-888b-246365473f9e.png} +0 -0
  152. /kotonebot/kaa/sprites/{c3ec61aa-f62e-46fd-b359-48864ea7a150.png → eb8d208a-dbcc-43ca-a8ac-098e1005ebfa.png} +0 -0
  153. /kotonebot/kaa/sprites/{9cd7e1f1-13c4-471e-abee-223ffd9126cb.png → ebe4ce64-98a9-40f2-9fde-3d5cdae673c7.png} +0 -0
  154. /kotonebot/kaa/sprites/{5ee8e9a8-b133-4ab7-a52c-e7e4e1d1ce7b.png → ef2ad3df-3f89-4a48-8fc3-c70a8adc1044.png} +0 -0
  155. /kotonebot/kaa/sprites/{68838f92-5916-424e-a37e-47e0b3834eb3.png → f05e410d-15b8-4831-bcc1-4cd8af07c882.png} +0 -0
  156. /kotonebot/kaa/sprites/{2e00ac54-d23a-4d51-82f2-829c012552a6.png → f1fac13a-84f3-42bd-9b52-e0ba90bc5255.png} +0 -0
  157. /kotonebot/kaa/sprites/{5dd0cc39-4102-4f0f-8ad3-342bbf825977.png → f7c34ab6-c165-48b7-ad5a-0b60613ce1bc.png} +0 -0
  158. /kotonebot/kaa/sprites/{dfb14c98-f672-4906-80bd-d2a18bdd62cd.png → fa80b14e-953f-44bd-a4ad-99aefd276fd7.png} +0 -0
  159. /kotonebot/kaa/sprites/{a4075991-98da-4d06-bcde-28054cd124d2.png → fe35655e-701b-4081-8df8-c17a7252acef.png} +0 -0
  160. /kotonebot/kaa/sprites/{df97421e-4b74-430e-b3d1-ed9bac6918a7.png → fe853ac7-934e-4b4a-bcc7-b986e057dfcf.png} +0 -0
  161. /kotonebot/kaa/sprites/{1aae0ab3-f619-47e0-8bf6-3d3791f7d445.png → ffda716c-2903-4ec7-8c59-aab5b8ad10bb.png} +0 -0
  162. /kotonebot/kaa/sprites/{6156116e-56dd-4b41-a6de-ccec55dab7c8.png → fff33200-c947-49f2-ab86-3ac98937fa36.png} +0 -0
  163. /kotonebot/kaa/{clear_logs.py → tasks/clear_logs.py} +0 -0
  164. {ksaa-2025.6.23.0.dist-info → ksaa-2025.6.28.0.dist-info}/WHEEL +0 -0
  165. {ksaa-2025.6.23.0.dist-info → ksaa-2025.6.28.0.dist-info}/entry_points.txt +0 -0
  166. {ksaa-2025.6.23.0.dist-info → ksaa-2025.6.28.0.dist-info}/licenses/LICENSE +0 -0
  167. {ksaa-2025.6.23.0.dist-info → ksaa-2025.6.28.0.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,15 @@
1
- from importlib import resources
2
1
  from typing_extensions import override
3
2
 
4
- from kotonebot.client import Device, DeviceImpl
5
- from kotonebot.client.registration import create_device
6
- from kotonebot.client.implements.windows import WindowsImplConfig
7
- from kotonebot.client.implements.remote_windows import RemoteWindowsImplConfig
3
+ from kotonebot.client import Device
8
4
  from kotonebot.client.host import HostProtocol, Instance
9
- from kotonebot.client.host.protocol import WindowsHostConfig, RemoteWindowsHostConfig
5
+ from kotonebot.client.host.windows_common import WindowsRecipes, WindowsHostConfigs, CommonWindowsCreateDeviceMixin
10
6
 
11
7
 
12
- DmmHostConfigs = WindowsHostConfig | RemoteWindowsHostConfig
8
+ DmmHostConfigs = WindowsHostConfigs
9
+ DmmRecipes = WindowsRecipes
13
10
 
14
11
  # TODO: 可能应该把 start_game 和 end_game 里对启停的操作移动到这里来
15
- class DmmInstance(Instance[DmmHostConfigs]):
12
+ class DmmInstance(CommonWindowsCreateDeviceMixin, Instance[DmmHostConfigs]):
16
13
  def __init__(self):
17
14
  super().__init__('dmm', 'gakumas')
18
15
 
@@ -37,31 +34,11 @@ class DmmInstance(Instance[DmmHostConfigs]):
37
34
  raise NotImplementedError()
38
35
 
39
36
  @override
40
- def create_device(self, impl: DeviceImpl, host_config: DmmHostConfigs) -> Device:
41
- if impl == 'windows':
42
- assert isinstance(host_config, WindowsHostConfig)
43
- win_config = WindowsImplConfig(
44
- window_title=host_config.window_title,
45
- ahk_exe_path=host_config.ahk_exe_path
46
- )
47
- return create_device(impl, win_config)
37
+ def create_device(self, impl: DmmRecipes, host_config: DmmHostConfigs) -> Device:
38
+ """为 DMM 实例创建 Device。"""
39
+ return super().create_device(impl, host_config)
48
40
 
49
- elif impl == 'remote_windows':
50
- assert isinstance(host_config, RemoteWindowsHostConfig)
51
- config = RemoteWindowsImplConfig(
52
- windows_impl_config=WindowsImplConfig(
53
- window_title=host_config.windows_host_config.window_title,
54
- ahk_exe_path=host_config.windows_host_config.ahk_exe_path
55
- ),
56
- host=host_config.host,
57
- port=host_config.port
58
- )
59
- return create_device(impl, config)
60
-
61
- else:
62
- raise ValueError(f'Unsupported impl for DMM: {impl}')
63
-
64
- class DmmHost(HostProtocol):
41
+ class DmmHost(HostProtocol[DmmRecipes]):
65
42
  instance = DmmInstance()
66
43
  """DmmInstance 单例。"""
67
44
 
@@ -77,3 +54,7 @@ class DmmHost(HostProtocol):
77
54
  @staticmethod
78
55
  def query(*, id: str) -> Instance | None:
79
56
  raise NotImplementedError()
57
+
58
+ @staticmethod
59
+ def recipes() -> 'list[DmmRecipes]':
60
+ return ['windows', 'remote_windows']
kotonebot/kaa/main/gr.py CHANGED
@@ -2,6 +2,7 @@ import os
2
2
  import traceback
3
3
  import zipfile
4
4
  import logging
5
+ import copy
5
6
  from functools import partial
6
7
  from itertools import chain
7
8
  from datetime import datetime, timedelta
@@ -33,6 +34,7 @@ ConfigKey = Literal[
33
34
  'check_emulator', 'emulator_path',
34
35
  'adb_emulator_name', 'emulator_args',
35
36
  '_mumu_index', '_leidian_index',
37
+ 'mumu_background_mode',
36
38
 
37
39
  # purchase
38
40
  'purchase_enabled',
@@ -94,17 +96,30 @@ ConfigSetFunction = Callable[[BaseConfig, Dict[ConfigKey, Any]], None]
94
96
  ConfigBuilderReturnValue = Tuple[ConfigSetFunction, Dict[ConfigKey, GradioInput]]
95
97
 
96
98
  def _save_bug_report(
99
+ title: str,
100
+ description: str,
97
101
  version: str,
102
+ upload: bool,
98
103
  path: str | None = None
99
104
  ) -> Generator[str, None, str]:
100
105
  """
101
106
  保存报告
102
107
 
103
- :param path: 保存的路径。若为 `None`,则保存到 `./reports/bug-{YY-MM-DD HH-MM-SS}.zip`。
108
+ :param title: 标题
109
+ :param description: 描述
110
+ :param version: 版本号
111
+ :param upload: 是否上传
112
+ :param path: 保存的路径。若为 `None`,则保存到 `./reports/bug-YY-MM-DD HH-MM-SS_标题.zip`。
104
113
  :return: 保存的路径
105
114
  """
106
115
  from kotonebot import device
107
116
  from kotonebot.backend.context import ContextStackVars
117
+ import re
118
+
119
+ # 过滤标题中的非法文件名字符
120
+ def sanitize_filename(s: str) -> str:
121
+ # 替换 \/:*?"<>| 为空或下划线
122
+ return re.sub(r'[\\/:*?"<>|]', '_', s)
108
123
 
109
124
  # 确保目录存在
110
125
  os.makedirs('logs', exist_ok=True)
@@ -112,8 +127,18 @@ def _save_bug_report(
112
127
 
113
128
  error = ""
114
129
  if path is None:
115
- path = f'./reports/bug-{datetime.now().strftime("%y-%m-%d %H-%M-%S")}.zip'
130
+ safe_title = sanitize_filename(title)[:30] or "无标题"
131
+ timestamp = datetime.now().strftime("%y-%m-%d-%H-%M-%S")
132
+ path = f'./reports/bug_{timestamp}_{safe_title}.zip'
116
133
  with zipfile.ZipFile(path, 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zipf:
134
+ # 打包描述文件
135
+ yield "### 打包描述文件..."
136
+ try:
137
+ description_content = f"标题:{title}\n类型:bug\n内容:\n{description}"
138
+ zipf.writestr('description.txt', description_content.encode('utf-8'))
139
+ except Exception as e:
140
+ error += f"保存描述文件失败:{str(e)}\n"
141
+
117
142
  # 打包截图
118
143
  yield "### 打包上次截图..."
119
144
  try:
@@ -158,12 +183,16 @@ def _save_bug_report(
158
183
  # 写出版本号
159
184
  zipf.writestr('version.txt', version)
160
185
 
186
+ if not upload:
187
+ yield f"### 报告已保存至 {os.path.abspath(path)}"
188
+ return path
189
+
161
190
  # 上传报告
162
- from kotonebot.ui.file_host.sensio import upload
191
+ from kotonebot.ui.file_host.sensio import upload as upload_file
163
192
  yield "### 上传报告..."
164
193
  url = ''
165
194
  try:
166
- url = upload(path)
195
+ url = upload_file(path)
167
196
  except Exception as e:
168
197
  yield f"### 上传报告失败:{str(e)}\n\n"
169
198
  return ''
@@ -371,9 +400,41 @@ class KotoneBotUI:
371
400
  assert key in CONFIG_KEY_VALUE, f"未知的配置项:{key}"
372
401
  key = cast(ConfigKey, key)
373
402
  data[key] = value
374
- # 设置结果
403
+
404
+ # 先设置options
375
405
  for (set_func, _) in return_values:
376
406
  set_func(options, data)
407
+
408
+ # 验证规则1:截图方法验证
409
+ screenshot_method = self.current_config.backend.screenshot_impl
410
+ backend_type = self.current_config.backend.type
411
+
412
+ valid_screenshot_methods = {
413
+ 'mumu12': ['adb', 'adb_raw', 'uiautomator2', 'nemu_ipc'],
414
+ 'leidian': ['adb', 'adb_raw', 'uiautomator2'],
415
+ 'custom': ['adb', 'adb_raw', 'uiautomator2'],
416
+ 'dmm': ['remote_windows', 'windows']
417
+ }
418
+
419
+ if screenshot_method not in valid_screenshot_methods.get(backend_type, []):
420
+ gr.Warning(f"截图方法 '{screenshot_method}' 不适用于当前选择的模拟器类型,配置未保存。")
421
+ return ""
422
+
423
+ # 验证规则2:若启用培育,那么培育偶像不能为空
424
+ if options.produce.enabled and not options.produce.idols:
425
+ gr.Warning("启用培育时,培育偶像不能为空,配置未保存。")
426
+ return ""
427
+
428
+ # 验证规则3:若启用AP/金币购买,对应的商品不能为空
429
+ if options.purchase.ap_enabled and not options.purchase.ap_items:
430
+ gr.Warning("启用AP购买时,AP商店购买物品不能为空,配置未保存。")
431
+ return ""
432
+
433
+ if options.purchase.money_enabled and not options.purchase.money_items:
434
+ gr.Warning("启用金币购买时,金币商店购买物品不能为空,配置未保存。")
435
+ return ""
436
+
437
+ # 验证通过,保存配置
377
438
  self.current_config.options = options
378
439
  try:
379
440
  save_config(self.config, "config.json")
@@ -393,7 +454,14 @@ class KotoneBotUI:
393
454
  if self._kaa.upgrade_msg:
394
455
  gr.Markdown('### 配置升级报告')
395
456
  gr.Markdown(self._kaa.upgrade_msg)
396
- gr.Markdown('脚本报错或者卡住?点击"日志"选项卡中的"一键导出报告"可以快速反馈!')
457
+ gr.Markdown('脚本报错或者卡住?前往"反馈"选项卡可以快速导出报告!')
458
+
459
+ # 添加调试模式警告
460
+ if self.current_config.keep_screenshots:
461
+ gr.Markdown(
462
+ '<div style="color: red; font-size: larger;">当前启用了调试功能「保留截图数据」,调试结束后正常使用时建议关闭此选项!</div>',
463
+ elem_classes=["debug-warning"]
464
+ )
397
465
 
398
466
  task_status = gr.Dataframe(
399
467
  headers=["任务", "状态"],
@@ -555,7 +623,9 @@ class KotoneBotUI:
555
623
  # choices = ['windows', 'remote_windows']
556
624
  # else: # Mumu, Leidian, Custom
557
625
  # choices = ['adb', 'adb_raw', 'uiautomator2']
558
- choices = ['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows']
626
+ # else:
627
+ # raise ValueError(f'Unsupported backend type: {type_in_config}')
628
+ choices = ['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows', 'nemu_ipc']
559
629
  if impl_value not in choices:
560
630
  new_value = choices[0]
561
631
  else:
@@ -576,13 +646,21 @@ class KotoneBotUI:
576
646
  choices=[(i.name, i.id) for i in instances],
577
647
  interactive=True
578
648
  )
649
+ mumu_background_mode = gr.Checkbox(
650
+ label="MuMu12 模拟器后台保活模式",
651
+ value=self.current_config.backend.mumu_background_mode,
652
+ info=BackendConfig.model_fields['mumu_background_mode'].description,
653
+ interactive=True
654
+ )
579
655
  except: # noqa: E722
580
656
  logger.exception('Failed to list installed MuMu12')
581
657
  gr.Markdown('获取 MuMu12 模拟器列表失败,请升级模拟器到最新版本。若问题依旧,前往 QQ 群、QQ 频道或 Github 反馈 bug。')
582
658
  mumu_instance = gr.Dropdown(visible=False)
659
+ mumu_background_mode = gr.Checkbox(visible=False)
583
660
  else:
584
661
  # 为了让 return 收集组件时不报错
585
662
  mumu_instance = gr.Dropdown(visible=False)
663
+ mumu_background_mode = gr.Checkbox(visible=False)
586
664
 
587
665
  with gr.Tab("雷电", interactive=has_leidian, id="leidian") as tab_leidian:
588
666
  gr.Markdown("已选中雷电模拟器")
@@ -661,7 +739,7 @@ class KotoneBotUI:
661
739
  # choices = ['adb', 'adb_raw', 'uiautomator2']
662
740
  # else:
663
741
  # raise ValueError(f'Unsupported backend type: {type_in_config}')
664
- choices = ['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows']
742
+ choices = ['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows', 'nemu_ipc']
665
743
  screenshot_impl = gr.Dropdown(
666
744
  choices=choices,
667
745
  value=self.current_config.backend.screenshot_impl,
@@ -711,6 +789,7 @@ class KotoneBotUI:
711
789
  if current_tab == 0: # Mumu
712
790
  self.current_config.backend.type = 'mumu12'
713
791
  self.current_config.backend.instance_id = data['_mumu_index']
792
+ self.current_config.backend.mumu_background_mode = data['mumu_background_mode']
714
793
  elif current_tab == 1: # Leidian
715
794
  self.current_config.backend.type = 'leidian'
716
795
  self.current_config.backend.instance_id = data['_leidian_index']
@@ -741,7 +820,8 @@ class KotoneBotUI:
741
820
  'adb_emulator_name': adb_emulator_name,
742
821
  'emulator_args': emulator_args,
743
822
  '_mumu_index': mumu_instance,
744
- '_leidian_index': leidian_instance
823
+ '_leidian_index': leidian_instance,
824
+ 'mumu_background_mode': mumu_background_mode
745
825
  }
746
826
 
747
827
  def _create_purchase_settings(self) -> ConfigBuilderReturnValue:
@@ -1460,27 +1540,33 @@ class KotoneBotUI:
1460
1540
  )
1461
1541
 
1462
1542
  def _create_log_tab(self) -> None:
1463
- with gr.Tab("日志"):
1464
- gr.Markdown("## 日志")
1465
-
1543
+ with gr.Tab("反馈"):
1544
+ gr.Markdown("## 反馈")
1545
+ gr.Markdown('脚本报错或者卡住?在这里填写信息可以快速反馈!')
1466
1546
  with gr.Column():
1547
+ report_title = gr.Textbox(label="标题", placeholder="用一句话概括问题")
1548
+ report_type = gr.Dropdown(label="反馈类型", choices=["bug"], value="bug", interactive=False)
1549
+ report_description = gr.Textbox(label="描述", lines=5, placeholder="详细描述问题。例如:什么时候出错、是否每次都出错、出错时的步骤是什么")
1467
1550
  with gr.Row():
1468
- export_dumps_btn = gr.Button("导出 dump")
1469
- export_logs_btn = gr.Button("导出日志")
1470
- with gr.Row():
1471
- save_report_btn = gr.Button("一键导出报告")
1551
+ upload_report_btn = gr.Button("上传")
1552
+ save_local_report_btn = gr.Button("保存至本地")
1553
+
1472
1554
  result_text = gr.Markdown("等待操作\n\n\n")
1473
1555
 
1474
- export_dumps_btn.click(
1475
- fn=self.export_dumps,
1476
- outputs=[result_text]
1477
- )
1478
- export_logs_btn.click(
1479
- fn=self.export_logs,
1556
+ def on_upload_click(title: str, description: str):
1557
+ yield from _save_bug_report(title, description, self._kaa.version, upload=True)
1558
+
1559
+ def on_save_local_click(title: str, description: str):
1560
+ yield from _save_bug_report(title, description, self._kaa.version, upload=False)
1561
+
1562
+ upload_report_btn.click(
1563
+ fn=on_upload_click,
1564
+ inputs=[report_title, report_description],
1480
1565
  outputs=[result_text]
1481
1566
  )
1482
- save_report_btn.click(
1483
- fn=partial(_save_bug_report, version=self._kaa.version),
1567
+ save_local_report_btn.click(
1568
+ fn=on_save_local_click,
1569
+ inputs=[report_title, report_description],
1484
1570
  outputs=[result_text]
1485
1571
  )
1486
1572
 
@@ -1493,6 +1579,7 @@ class KotoneBotUI:
1493
1579
  def _create_screen_tab(self) -> None:
1494
1580
  with gr.Tab("画面"):
1495
1581
  gr.Markdown("## 当前设备画面")
1582
+ refresh_btn = gr.Button("刷新画面", variant="primary")
1496
1583
  WIDTH = 720 // 3
1497
1584
  HEIGHT = 1280 // 3
1498
1585
  last_update_text = gr.Markdown("上次更新时间:无数据")
@@ -1501,14 +1588,14 @@ class KotoneBotUI:
1501
1588
  def update_screenshot():
1502
1589
  ctx = ContextStackVars.current()
1503
1590
  if ctx is None:
1504
- return [None, last_update_text.value]
1591
+ return [None, "上次更新时间:无上下文数据"]
1505
1592
  screenshot = ctx._screenshot
1506
1593
  if screenshot is None:
1507
- return [None, last_update_text.value]
1594
+ return [None, "上次更新时间:无截图数据"]
1508
1595
  screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2RGB)
1509
1596
  return screenshot, f"上次更新时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
1510
1597
 
1511
- gr.Timer(0.3).tick(
1598
+ refresh_btn.click(
1512
1599
  fn=update_screenshot,
1513
1600
  outputs=[screenshot_display, last_update_text]
1514
1601
  )
kotonebot/kaa/main/kaa.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import io
2
2
  import os
3
+ from typing import Any, Literal, cast
3
4
  import zipfile
4
5
  import logging
5
6
  import traceback
@@ -9,6 +10,8 @@ from typing_extensions import override
9
10
 
10
11
  import cv2
11
12
 
13
+ from kotonebot.client.host.mumu12_host import MuMu12HostConfig
14
+
12
15
  from ...client import Device
13
16
  from kotonebot.ui import user
14
17
  from kotonebot import KotoneBot
@@ -112,6 +115,10 @@ class Kaa(KotoneBot):
112
115
  if self.backend_instance is None:
113
116
  raise ValueError('Backend instance is not set.')
114
117
  _set_instance(self.backend_instance)
118
+ from kotonebot import device
119
+ logger.info('Set target resolution to 720x1280.')
120
+ device.orientation = 'portrait'
121
+ device.target_resolution = (720, 1280)
115
122
 
116
123
  def __get_backend_instance(self, config: UserConfig) -> Instance:
117
124
  """
@@ -228,12 +235,32 @@ class Kaa(KotoneBot):
228
235
  else:
229
236
  raise ValueError(f"Impl of '{impl_name}' is not supported on DMM.")
230
237
  return self.backend_instance.create_device(impl_name, host_conf)
231
-
232
238
  # 统一处理所有基于 ADB 的后端
233
239
  elif isinstance(self.backend_instance, (CustomInstance, Mumu12Instance, LeidianInstance)):
234
- if impl_name in ['adb', 'adb_raw', 'uiautomator2']:
235
- host_conf = AdbHostConfig(timeout=180)
240
+ if impl_name == 'nemu_ipc' and isinstance(self.backend_instance, Mumu12Instance):
241
+ impl_name = cast(Literal['nemu_ipc'], impl_name)
242
+ options = cast(BaseConfig, user_config.options)
243
+
244
+ # 根据 mumu_background_mode 决定是否传递后台保活参数
245
+ if user_config.backend.mumu_background_mode:
246
+ host_conf = MuMu12HostConfig(
247
+ display_id=None,
248
+ target_package_name=options.start_game.game_package_name,
249
+ app_index=0,
250
+ timeout=180
251
+ )
252
+ else:
253
+ host_conf = MuMu12HostConfig(
254
+ timeout=180
255
+ )
236
256
  return self.backend_instance.create_device(impl_name, host_conf)
257
+ elif impl_name in ['adb', 'adb_raw', 'uiautomator2']:
258
+ impl_name = cast(Literal['adb', 'adb_raw', 'uiautomator2'], impl_name)
259
+ host_conf = AdbHostConfig(timeout=180)
260
+ return self.backend_instance.create_device(
261
+ cast(Any, impl_name), # :(
262
+ host_conf
263
+ )
237
264
  else:
238
265
  raise ValueError(f"{user_config.backend.type} backend does not support implementation '{impl_name}'")
239
266
 
kotonebot/kaa/metadata.py CHANGED
@@ -1,6 +1,38 @@
1
1
  WHATS_NEW = """
2
2
  # 更新日志
3
3
  ## kaa
4
+ ### v2025.6.28.0
5
+ 脚本:
6
+ * [修复] 修正 debug_entry 脚本路径处理逻辑(#b53a055)
7
+ * [修复] 修复清理日志功能失效的问题(#ad5c7b7)
8
+ * [修复] 修复 debug_entry 执行的脚本没有正确输出日志的问题(#3ceae4c)
9
+
10
+ 界面:
11
+ * [新增] 优化日志导出功能(#9574d20)
12
+ * [新增] 为 UI 增加部分配置有效性验证(#08a7e71)
13
+ * [新增] 加入调试模式警告提示(#a01c37d)
14
+ * [新增] 画面 Tab 刷新机制由自动改为手动(#2469fc0)
15
+ * [新增] MuMu12 保活模式可选开启(#71170e5)
16
+
17
+ 框架:
18
+ * [修复] 修复 Device 中缩放与截图 Hook 的处理顺序不正确问题
19
+ * [修复] 修复 NemuIpc 在多显示器下的坐标系问题(#87da282)
20
+ * [修复] 修复当目标分辨率与实际分辨率旋转不同时截图会强制拉伸的问题(#e62e65d)
21
+ * [修复] 缩放处理支持自动识别旋转(#677932a)
22
+ * [修复] 修复 NemuIpc 截图无法响应屏幕旋转导致的分辨率变化(#105a894)
23
+ * [新增] NemuIpcImpl 获取显示器 ID 支持自动重试(#0c94acf)
24
+ * [新增] 支持 MuMu12 后台保活模式(#e232826)
25
+ * [新增] 引入 Nemu 截图与控制方式(#f0b9181)
26
+ * [新增] 移除 WindowsImpl 中的分辨率缩放(#415a8df)
27
+ * [新增] 支持等比例分辨率缩放(#bb7f603)
28
+ * [重构] 组装 Device 改用 recipe 方案(#f01e022)
29
+ * [重构] 将传递的 MuMu 路径从 shell 目录改为 MuMu 根目录(#784b8ed)
30
+
31
+ 其他:
32
+ * [其他] HsvRangeTool 支持从剪贴板粘贴图片(#1397587)
33
+ * [其他] VSCode 新增不初始化 context 的启动配置(#0718678)
34
+ * [其他] 调整部分日志输出格式(#bcd8cf2)
35
+
4
36
  ### v2025.6.23.0
5
37
  脚本:
6
38
  * [新增] 优化了培育开始的逻辑,修复若干 bug(#86313ec)