ksaa 2025.11b1__py3-none-any.whl → 2025.11.post1__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 (352) hide show
  1. kaa/__init__.py +0 -0
  2. kaa/application/__init__.py +0 -0
  3. kaa/application/core/misc_core.py +4 -1
  4. kaa/application/services/__init__.py +0 -0
  5. kaa/application/services/config_service.py +112 -0
  6. kaa/application/services/feedback_service.py +121 -0
  7. kaa/application/services/produce_solution_service.py +83 -0
  8. kaa/application/services/task_service.py +145 -0
  9. kaa/application/services/update_service.py +208 -0
  10. kaa/application/ui/__init__.py +0 -0
  11. kaa/application/ui/common.py +123 -0
  12. kaa/application/ui/components/alert.py +251 -0
  13. kaa/application/ui/components/alert.pyi +257 -0
  14. kaa/application/ui/components/categorized_select.pyi +697 -0
  15. kaa/application/ui/facade.py +189 -0
  16. kaa/application/ui/gradio_view.py +135 -0
  17. kaa/application/ui/views/__init__.py +0 -0
  18. kaa/application/ui/views/feedback_view.py +65 -0
  19. kaa/application/ui/views/produce_view.py +251 -0
  20. kaa/application/ui/views/settings_view.py +581 -0
  21. kaa/application/ui/views/status_view.py +171 -0
  22. kaa/application/ui/views/task_view.py +102 -0
  23. kaa/application/ui/views/update_view.py +106 -0
  24. kaa/config/schema.py +8 -0
  25. kaa/db/constants.py +3 -2
  26. kaa/errors.py +60 -0
  27. kaa/main/gr.py +60 -3132
  28. kaa/main/kaa.py +11 -3
  29. kaa/metadata.py +80 -0
  30. kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  31. kaa/resources/game.db +0 -0
  32. kaa/resources/game_ver.txt +0 -0
  33. kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
  34. kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
  35. kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
  36. kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
  37. kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
  38. kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
  39. kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
  40. kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
  41. kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
  42. kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
  43. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
  44. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
  45. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
  46. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
  47. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
  48. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
  49. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
  50. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
  51. kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
  52. kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
  53. kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
  54. kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
  55. kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
  56. kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
  57. kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
  58. kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
  59. kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
  60. kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
  61. kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
  62. kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
  63. kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
  64. kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
  65. kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
  66. kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
  67. kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
  68. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
  69. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
  70. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
  71. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
  72. kaa/sprites/052ab0f5-8d95-4b5d-8678-3838322d9e5e.png +0 -0
  73. kaa/sprites/18adb1a5-b95d-41ff-9cb9-16613fa4cf6a.png +0 -0
  74. kaa/sprites/2aac3a97-435e-4c02-925f-e2d1673b7982.png +0 -0
  75. kaa/sprites/2cc63c6d-5988-4f72-ae88-b03b8246ad97.png +0 -0
  76. kaa/sprites/3208d803-2c92-4775-80dc-0527df4b63d9.png +0 -0
  77. kaa/sprites/345435d0-5a5c-494b-95ab-1e086fb88f51.png +0 -0
  78. kaa/sprites/3ad30d90-8b57-4641-a9e2-33970e5cea1d.png +0 -0
  79. kaa/sprites/3e0da5df-a4de-42bd-83bd-13df3c393af4.png +0 -0
  80. kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
  81. kaa/sprites/44a50906-1835-4e29-ae97-496b4cdde9e9.png +0 -0
  82. kaa/sprites/488a1403-d300-4fa6-94c7-da71d09fd4bb.png +0 -0
  83. kaa/sprites/48c16d60-05d6-43bc-97c3-7f099bfc0881.png +0 -0
  84. kaa/sprites/4e3dbeb5-70bb-4642-9f73-01f9f98bc3aa.png +0 -0
  85. kaa/sprites/54987de4-3e1b-4640-b203-1e4c82d7e98d.png +0 -0
  86. kaa/sprites/5a0bfeac-fb22-4b0c-b775-4aa6220bae89.png +0 -0
  87. kaa/sprites/5aad0930-54a3-4b6d-bec8-250228963f69.png +0 -0
  88. kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
  89. kaa/sprites/5c9a1581-a14a-449b-a1b0-7a31a965facc.png +0 -0
  90. kaa/sprites/62411b55-7be8-46d9-aa4a-fb56dab6658c.png +0 -0
  91. kaa/sprites/6580ea89-553e-4445-a855-f834d580e6e6.png +0 -0
  92. kaa/sprites/686a2bf5-0498-4d53-8ba1-1110ff36f046.png +0 -0
  93. kaa/sprites/699ca639-3006-45c1-b5fd-8cf9631fd3ea.png +0 -0
  94. kaa/sprites/6e8325f9-7fdb-4729-ac13-ca67244d97bc.png +0 -0
  95. kaa/sprites/71051aa7-81f1-4144-9318-4405e10547ee.png +0 -0
  96. kaa/sprites/732ffc6c-6a17-41f8-9cd1-f218ebc0c23f.png +0 -0
  97. kaa/sprites/744ea25a-9b6e-4f8f-9a00-0ac714571b09.png +0 -0
  98. kaa/sprites/74b50642-0b18-45c3-8a5d-013ef1e0eb78.png +0 -0
  99. kaa/sprites/77e7262f-0d12-4bd9-9f22-e8f41a600bf8.png +0 -0
  100. kaa/sprites/78b928c6-0d24-4e87-a84f-0091d42f8e49.png +0 -0
  101. kaa/sprites/7c193df5-0a1d-444d-9f92-e9c0db79e53a.png +0 -0
  102. kaa/sprites/7e729638-f54a-48bb-8bbf-eeaa4d697502.png +0 -0
  103. kaa/sprites/802e717f-d70a-4f34-8b96-be586a8dfde9.png +0 -0
  104. kaa/sprites/831cac7e-49e9-45d1-bb65-b1db733cda90.png +0 -0
  105. kaa/sprites/8411b102-866d-4e41-ab12-507397b80ca5.png +0 -0
  106. kaa/sprites/84b3c8e2-6e37-443c-be9b-8a95aedc6f37.png +0 -0
  107. kaa/sprites/85308e03-ba72-499a-9d12-870269fa3cd0.png +0 -0
  108. kaa/sprites/8922feef-17db-4b10-93da-1bad30492ac2.png +0 -0
  109. kaa/sprites/8a6ed80c-79c6-4df6-ab65-64d67afb2d5b.png +0 -0
  110. kaa/sprites/8c0439d9-9eb7-43f3-8d1e-7e41c57c1bbd.png +0 -0
  111. kaa/sprites/8dd3de6d-07d5-4d93-9663-71a3a4c57a32.png +0 -0
  112. kaa/sprites/9009323d-1418-4aed-8a93-075b326d2e7a.png +0 -0
  113. kaa/sprites/904d22f7-51be-486f-8dd1-1871c0cf28e3.png +0 -0
  114. kaa/sprites/90943f62-0a03-4a75-804a-0c2fa7b27af4.png +0 -0
  115. kaa/sprites/9180e0e7-2cc4-46c7-95ff-fbe83806baf2.png +0 -0
  116. kaa/sprites/93f5c33e-ec81-4a70-a11f-b2e8cb1751ee.png +0 -0
  117. kaa/sprites/9558b2a5-3961-4ad0-9ce8-379d71920d78.png +0 -0
  118. kaa/sprites/968dff88-5a2f-42c7-b64b-406801e22c87.png +0 -0
  119. kaa/sprites/99d99d78-ee37-4e84-8768-b5a7f4f9bd51.png +0 -0
  120. kaa/sprites/9caa102c-70af-4a8c-b595-82df9f4c05d8.png +0 -0
  121. kaa/sprites/9e06b7d6-5d15-4844-bbfe-ad1af7da3113.png +0 -0
  122. kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
  123. kaa/sprites/a04ed558-25e3-42d7-a662-250cad9fa5df.png +0 -0
  124. kaa/sprites/a0a62dbf-a027-4b63-86e4-2e863b2edb01.png +0 -0
  125. kaa/sprites/a4b898aa-405e-4235-8075-a34640a2b023.png +0 -0
  126. kaa/sprites/a5c3108f-c92d-4ce7-8c4e-93b79f55ceb3.png +0 -0
  127. kaa/sprites/a7e6222f-f8ca-47c2-af1e-f158a87f6a03.png +0 -0
  128. kaa/sprites/ab3d3301-8297-43a8-bf0b-85413c115a7d.png +0 -0
  129. kaa/sprites/ad589feb-6d19-47c7-a582-55ee130ee89d.png +0 -0
  130. kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
  131. kaa/sprites/aed87cd4-eb05-4c24-8adf-cd3fab20e9a3.png +0 -0
  132. kaa/sprites/afb9e4a9-29a5-4202-9f75-e7d2f1b64aa4.png +0 -0
  133. kaa/sprites/b1f547d4-c1ba-43fc-9398-4ccdc25b8b62.png +0 -0
  134. kaa/sprites/b61bd48f-1fe7-49fd-a588-09aac3b66f5a.png +0 -0
  135. kaa/sprites/b6219452-323a-44eb-9f44-97b2ad0ee49a.png +0 -0
  136. kaa/sprites/b7550a50-5943-45e7-9c1b-771117364844.png +0 -0
  137. kaa/sprites/b865eedf-7bea-46f6-bf14-7f8f4e9ab000.png +0 -0
  138. kaa/sprites/b8f0ed47-6115-4b88-848a-2fc4a1ab25d8.png +0 -0
  139. kaa/sprites/b9224799-d0c1-43d9-9f11-1d35903fc4d9.png +0 -0
  140. kaa/sprites/baa9c530-68cb-4111-85f6-060823ad32c4.png +0 -0
  141. kaa/sprites/bed54f67-d828-403c-9cb3-6a7c85695c2a.png +0 -0
  142. kaa/sprites/befadc5e-862a-4818-9223-5d58e4ac03cb.png +0 -0
  143. kaa/sprites/c0d1896c-71a1-47d6-9847-b87543a942e9.png +0 -0
  144. kaa/sprites/c2984c0f-3e17-45c3-9d7c-dc4f14440b13.png +0 -0
  145. kaa/sprites/c6b53acc-bc89-465e-9814-0138513327ac.png +0 -0
  146. kaa/sprites/c72a4609-6bf0-4568-8ebc-73c30d67c61e.png +0 -0
  147. kaa/sprites/c7829f82-bfce-4259-9ec6-f1cfb7bac925.png +0 -0
  148. kaa/sprites/c82ebc01-0127-417f-831a-9d17a84b2691.png +0 -0
  149. kaa/sprites/c8747b3b-745c-45ed-84b6-dde1b2558ce8.png +0 -0
  150. kaa/sprites/c98ef89e-4a1c-40f0-a82e-6851f7b6bbc9.png +0 -0
  151. kaa/sprites/cb04d87c-f5a9-405c-92ac-b3603e482221.png +0 -0
  152. kaa/sprites/cb43f670-6623-4af9-ac1d-746372e40511.png +0 -0
  153. kaa/sprites/ce357023-436b-4a39-882f-8410acd8f0d7.png +0 -0
  154. kaa/sprites/cea9f5ea-5923-4c6e-bd24-90d2e084112c.png +0 -0
  155. kaa/sprites/cf62e2df-3be1-4d03-9f34-1518280abd90.png +0 -0
  156. kaa/sprites/d0a483a9-400f-4b6e-87a0-9781b4454da0.png +0 -0
  157. kaa/sprites/d10d480c-e96e-475e-815c-0969f37fe3bc.png +0 -0
  158. kaa/sprites/d1839450-8d60-41a4-b035-8e1acd0f1c7a.png +0 -0
  159. kaa/sprites/d19859f3-f7cc-46ef-8bc6-86df7856fd53.png +0 -0
  160. kaa/sprites/d2d3d77d-a06f-4167-b02b-5ca688c0c0c3.png +0 -0
  161. kaa/sprites/d38c5015-e461-4e09-8b56-731472bdf59e.png +0 -0
  162. kaa/sprites/d473b5bd-4be3-4f0f-bb92-b909050f273a.png +0 -0
  163. kaa/sprites/d609a029-5407-43c2-a9a9-07bfd43fcbb8.png +0 -0
  164. kaa/sprites/d6491f82-9637-47eb-8f35-eb272b5ef8df.png +0 -0
  165. kaa/sprites/d8dd8b59-c05c-4350-a15d-be75c94d46cc.png +0 -0
  166. kaa/sprites/d98263bf-15fb-430e-ba39-2558fa99cac0.png +0 -0
  167. kaa/sprites/d9bc9bbb-9a1a-4cbe-b6ed-24112d7c5ac7.png +0 -0
  168. kaa/sprites/da922566-97ba-4477-bcad-35ea02a3ee48.png +0 -0
  169. kaa/sprites/dac8d8fd-006c-4f50-a4e0-d79dbf3f5915.png +0 -0
  170. kaa/sprites/db33ab8d-160d-48c7-b464-dfe194e762d4.png +0 -0
  171. kaa/sprites/dcfdfab4-8dfb-4069-bf88-8e8401ef86f3.png +0 -0
  172. kaa/sprites/de354b53-2fd0-4039-87e2-fcad2e070579.png +0 -0
  173. kaa/sprites/e28ea25e-0bcf-4d52-b501-9ef7a4863870.png +0 -0
  174. kaa/sprites/e2ac927f-257e-4537-995d-fbfbe4983b70.png +0 -0
  175. kaa/sprites/e642b9ef-c8a7-41d5-8d71-5cfbaf3017a1.png +0 -0
  176. kaa/sprites/e749feec-6bf2-4c24-bb12-948e696b8116.png +0 -0
  177. kaa/sprites/ed3aa6e6-4256-416b-9d04-d57ca340e39d.png +0 -0
  178. kaa/sprites/ed4c0554-84df-4c29-af18-7c38523cc59b.png +0 -0
  179. kaa/sprites/ef1bfd47-78e9-4cb7-a344-53d980fc3e5e.png +0 -0
  180. kaa/sprites/ef1ddc7d-75f9-4798-afa1-733e16794a81.png +0 -0
  181. kaa/sprites/efb01328-b6e1-438e-9471-bef3ea77a22c.png +0 -0
  182. kaa/sprites/f06b1a4f-eeb6-4dea-9543-5ec27640bdd9.png +0 -0
  183. kaa/sprites/f07bac27-9201-498f-9f26-a58291a70542.png +0 -0
  184. kaa/sprites/f0fd613b-d2f8-4b18-90d8-0b328373e715.png +0 -0
  185. kaa/sprites/f1fbe46a-759d-467d-b8ca-2158f530f7c5.png +0 -0
  186. kaa/sprites/f2314c76-3a2b-4644-831a-343a601145df.png +0 -0
  187. kaa/sprites/f329d4ba-e836-4be6-a05b-879b53667df3.png +0 -0
  188. kaa/sprites/f469d235-552f-4b07-9d03-9bcae425b6d8.png +0 -0
  189. kaa/sprites/f5177258-a3cf-4d4f-9c69-0b49556f754f.png +0 -0
  190. kaa/sprites/f5dcac82-7c54-4020-84c5-b1334b595612.png +0 -0
  191. kaa/sprites/f6656842-1460-41ab-95ed-561aefaf08e2.png +0 -0
  192. kaa/sprites/f70e9455-7cc8-449c-8282-89a9e69f7ac3.png +0 -0
  193. kaa/sprites/f7fd469f-791e-4bf7-ae3f-b5aaed92f999.png +0 -0
  194. kaa/sprites/f873280f-bc68-40d1-8d8d-3d86964264f0.png +0 -0
  195. kaa/sprites/f9da6eeb-ff9e-45b3-94b0-e7ba34938dec.png +0 -0
  196. kaa/sprites/fa24f5d5-d7e5-4421-8cbc-2ce3a0189654.png +0 -0
  197. kaa/sprites/fb61dbf3-fbc1-400a-adde-83ea08b5027d.png +0 -0
  198. kaa/sprites/fc8457b6-f8a3-4b01-9864-0cd624c312b6.png +0 -0
  199. kaa/sprites/fdbf6a89-b95a-481f-a269-be53e05b18de.png +0 -0
  200. kaa/sprites/fed11307-2186-4ede-875f-ffa0383f410c.png +0 -0
  201. kaa/sprites/ff0d3db2-c4e5-41e7-a85b-df4fd392924c.png +0 -0
  202. kaa/sprites/ff40ff91-4e8c-46cb-a254-66cd5ffd363e.png +0 -0
  203. kaa/sprites/ff614071-c318-4263-af3e-01ea0ab45b73.png +0 -0
  204. kaa/tasks/R.py +136 -128
  205. kaa/tasks/R2.py +24 -0
  206. kaa/tasks/common.py +5 -0
  207. kaa/tasks/daily/club_reward.py +1 -0
  208. kaa/tasks/daily/contest.py +2 -1
  209. kaa/tasks/daily/purchase.py +33 -1
  210. kaa/tasks/daily/upgrade_support_card.py +12 -2
  211. kaa/tasks/produce/cards.py +5 -4
  212. kaa/tasks/produce/common.py +202 -105
  213. kaa/tasks/produce/in_purodyuusu.py +35 -17
  214. kaa/tasks/produce/non_lesson_actions.py +10 -33
  215. kaa/tasks/produce/p_drink.py +5 -1
  216. kaa/tasks/produce/produce.py +2 -1
  217. kaa/tasks/start_game.py +2 -1
  218. kaa/util/reactive.py +182 -0
  219. {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/METADATA +27 -24
  220. {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/RECORD +352 -181
  221. /kaa/sprites/{35341839-4469-4ab6-aa40-33642fe43e82.png → 01e93c2c-28dc-41f8-8f9a-ec62ec12aa01.png} +0 -0
  222. /kaa/sprites/{68d9f340-a3d2-4708-8eb1-c1ed857decda.png → 02ac01e0-00b0-46d8-a6db-56248c843c6d.png} +0 -0
  223. /kaa/sprites/{39f6d657-3b3e-40aa-849b-7ad87a0be1d0.png → 033e73d1-9f45-4bca-bf96-6778410f2fc4.png} +0 -0
  224. /kaa/sprites/{799fe395-2264-4bc5-b515-813dadda8fe1.png → 04036690-5b0f-4ee0-a9d0-022ee822bf0e.png} +0 -0
  225. /kaa/sprites/{256ffeba-8e9e-4cc5-8a1c-9eaee427f1a5.png → 041bd3fc-d040-4773-8641-4e4509300d2f.png} +0 -0
  226. /kaa/sprites/{5ffd3f29-db4f-4f66-b9ed-be5a70b7ebf9.png → 04974917-b1e8-4ccc-807b-6f651026c955.png} +0 -0
  227. /kaa/sprites/{8be81341-a74d-42c8-8231-5d1854bc08e7.png → 04c4e4c2-9908-4be7-bcbe-4d926ca76737.png} +0 -0
  228. /kaa/sprites/{043e753e-db15-45ba-8513-53c3fc9c7f3c.png → 05b97cdf-f7df-4d91-9ec8-5e9594a46382.png} +0 -0
  229. /kaa/sprites/{5431dc38-c257-40b3-8f7b-8bceaa7fe587.png → 061b032f-860b-4c53-889b-aa126797f062.png} +0 -0
  230. /kaa/sprites/{cb6dffd9-6474-4d09-aee6-26352ea51d31.png → 07b43eb9-db32-4046-96d3-9f4314bfd80a.png} +0 -0
  231. /kaa/sprites/{3e087b8d-420d-48ff-b526-29c4a65d8cbe.png → 08b12ded-8230-4c7e-bb9f-27c85b0fdabb.png} +0 -0
  232. /kaa/sprites/{68e20ebf-02fd-46a1-88d7-b4472824e7bc.png → 09364c3a-f892-4911-abdc-2f5fea09289f.png} +0 -0
  233. /kaa/sprites/{c69dcdcf-42a7-420e-aa8e-bb8639ea80b6.png → 09d2a63d-d2f0-4b97-b3cb-22a61b1530f7.png} +0 -0
  234. /kaa/sprites/{d644faa3-ff16-417f-928c-4c62b040bfdb.png → 0cad6e46-276f-424e-a79e-d272ebaa7c8e.png} +0 -0
  235. /kaa/sprites/{db6707a2-2964-4919-9992-4d801fa43dae.png → 0e49fbde-6be6-42b3-b8d1-36e0cb9cc35d.png} +0 -0
  236. /kaa/sprites/{cd00a2d7-af48-48b1-b2e1-5360ceed249f.png → 0e51d671-928c-4972-8ac0-de446202070b.png} +0 -0
  237. /kaa/sprites/{736a9daf-05d6-46ba-810b-5a8f509152d1.png → 0e6f8981-f46c-4c7d-9d90-fe349f0a1d77.png} +0 -0
  238. /kaa/sprites/{92c3de1b-eed1-45b9-82e0-c9e97bb479e7.png → 0e9e3dbf-6e94-4a12-b558-3d8ab500c0a6.png} +0 -0
  239. /kaa/sprites/{913dbd4e-ebb1-4c9f-b145-9960cde59c17.png → 0eafb6c1-9d85-4fe0-8011-7235704ca9d3.png} +0 -0
  240. /kaa/sprites/{ec3cad5f-e0c9-4577-8499-79b50248344e.png → 1002a830-1ad5-47a7-b7dd-ed2989e6fc1b.png} +0 -0
  241. /kaa/sprites/{e5e49b44-dcc2-4e77-9180-0d2beaa3f9ad.png → 10943367-c1d8-41c7-a831-d5d05288875a.png} +0 -0
  242. /kaa/sprites/{c1d502eb-c77f-45cb-86b5-11b4a8a3aef5.png → 10f37db0-8c3e-4790-a5c3-cdb841f106a7.png} +0 -0
  243. /kaa/sprites/{802db04f-77c2-46a4-a6eb-f81d48ea03ce.png → 11f65378-b982-4936-9ac7-68560a74a042.png} +0 -0
  244. /kaa/sprites/{1befe09b-cb77-417a-b21e-7746804d4e03.png → 1660acf7-a420-4d92-a90c-55c5ff208da6.png} +0 -0
  245. /kaa/sprites/{16a0fd47-e85b-4848-8894-9d071ea993ac.png → 170d28bf-d262-4bf1-b35f-8f3d4b4fff6e.png} +0 -0
  246. /kaa/sprites/{5906d986-d0e5-452d-a7c4-ddeb7af8751d.png → 182d8c71-5ce5-4ee1-9f66-ef99aadae654.png} +0 -0
  247. /kaa/sprites/{cfe3563d-a24b-4197-a0cb-5628bd990c08.png → 18d26894-fd12-4644-8269-a09d11be9520.png} +0 -0
  248. /kaa/sprites/{8e5e968b-edad-4c03-abc8-3f2a7e8879ae.png → 1b0dd18b-eb41-4c9c-b031-bab91c93fd5d.png} +0 -0
  249. /kaa/sprites/{3fa5f81c-9223-44ba-bf07-71932350e845.png → 1e7a6e19-760c-4fbc-b0f1-f620f51056b9.png} +0 -0
  250. /kaa/sprites/{9e7eaa8e-3178-44da-a5ec-34b889f8facf.png → 1fbe13d6-3a4d-4935-b687-a76a76a1e32c.png} +0 -0
  251. /kaa/sprites/{1ad89ee4-1bb1-41d2-a92c-79caf6baa38a.png → 1fe31432-a050-48db-acc1-becde42deaf9.png} +0 -0
  252. /kaa/sprites/{94d54ba7-0ccf-4fd9-a5bf-488bac1364c8.png → 20146fe6-e62b-4c57-b229-901994903b70.png} +0 -0
  253. /kaa/sprites/{6c926e92-9af9-402d-8512-6417ca116928.png → 20c673e9-fcbe-469b-be35-7844a1d5a9cd.png} +0 -0
  254. /kaa/sprites/{572a921d-633f-4465-b177-7a0d9ad7e099.png → 21747ae5-d94d-45d1-bda8-939389dc4874.png} +0 -0
  255. /kaa/sprites/{aa1624ff-88b0-447b-8e2b-8a50fd9e4062.png → 21fbbe96-02bf-4835-aa04-068bc5cc6ca3.png} +0 -0
  256. /kaa/sprites/{3b4dc708-1d34-4a88-9fe3-d8de2ec1d5c8.png → 24be7d90-7944-4a0a-a60c-67c9737b322c.png} +0 -0
  257. /kaa/sprites/{b59c0e9b-1f20-4194-ab37-286f505fa656.png → 24d6a47c-2099-45e2-9a67-b37767f459fc.png} +0 -0
  258. /kaa/sprites/{023b8f4c-15ab-4845-b141-446c861ad475.png → 2568d3d3-b642-4ea4-b929-4dee0b09738a.png} +0 -0
  259. /kaa/sprites/{7d7df15f-707e-4e27-826f-21e42af1dae0.png → 263b1037-fb51-4eb1-8c71-5232b03235d2.png} +0 -0
  260. /kaa/sprites/{f0aef696-2106-46a4-8b7f-9f16b6c89d3f.png → 27dbd535-7f95-4698-8fea-2bed67dd6968.png} +0 -0
  261. /kaa/sprites/{81686816-c723-47d1-9824-a68d9ebe1bd4.png → 286801f7-3af5-4cd0-9c25-46c12c2cd8f8.png} +0 -0
  262. /kaa/sprites/{dc97fea3-898f-4135-9c40-ad41570ab4ae.png → 298182ae-747a-44e3-8511-a64d3532b8ac.png} +0 -0
  263. /kaa/sprites/{8e019262-ad23-4cbb-84da-86b34775a91e.png → 2d3470f8-a714-4175-a8fe-71eef80921b6.png} +0 -0
  264. /kaa/sprites/{01247ebe-8d63-4573-90f4-d8dc2b7ca14c.png → 2e3b2982-d14b-4b49-bb64-da8178311d75.png} +0 -0
  265. /kaa/sprites/{fcc72120-2a77-4c26-a27e-e1027c6088c0.png → 2e41df89-a8d7-4e7e-96cb-7f551414823b.png} +0 -0
  266. /kaa/sprites/{31f2de0a-567b-425a-9be6-536e4532d813.png → 31e02e56-f266-47b5-8b10-fe79fe06d614.png} +0 -0
  267. /kaa/sprites/{7daaca55-e3fd-4e12-bf31-872105ceb726.png → 3314dc6c-868f-4045-9f60-1f3a17fed324.png} +0 -0
  268. /kaa/sprites/{fdf0da06-f088-424f-9941-8c883fea3db3.png → 358f1561-c16f-45a0-842d-d62fc735dc80.png} +0 -0
  269. /kaa/sprites/{51b95c81-4ff9-434c-ade2-3518e63337cb.png → 3782897a-f1c2-4f05-a02d-4c760672f52a.png} +0 -0
  270. /kaa/sprites/{847eb5c0-0350-4b7c-9c9c-43c796709795.png → 385e60df-2063-4caf-b1ea-e6ac909bc49d.png} +0 -0
  271. /kaa/sprites/{8e4d8a0f-4a9d-4562-9234-63806b11d85f.png → 39450419-26b5-4fbd-a5d4-1bab369ced30.png} +0 -0
  272. /kaa/sprites/{424a0ef5-102d-4734-a731-2b3b3c7c9682.png → 397c0e24-f35a-48c9-a576-aa1fcfc517b5.png} +0 -0
  273. /kaa/sprites/{23b9cda9-8be8-438e-8e54-57d91a4bd875.png → 3adef8f4-629d-4cb7-b54a-dadabfea155e.png} +0 -0
  274. /kaa/sprites/{2234f709-1703-4589-905c-175f4db09b1b.png → 3b86b4ac-aa29-4309-82da-f47a174d88cc.png} +0 -0
  275. /kaa/sprites/{e933cd55-e47a-4327-89d7-b25995cb4a3f.png → 3c6bbcea-488d-4df8-ab40-21e263aa0b16.png} +0 -0
  276. /kaa/sprites/{49bde219-f9a3-41b5-84b8-e417160a0f40.png → 3db54e0b-672d-4dfd-8a9b-5db37a08be74.png} +0 -0
  277. /kaa/sprites/{2204967a-a0ee-4dd3-aecb-4d531e8e954c.png → 402d430d-b507-4aa6-b3e1-db66b38c71b4.png} +0 -0
  278. /kaa/sprites/{70768479-5d7a-4941-8774-ad556c47bee2.png → 414140a2-de67-4c7f-a7f6-c8b30a6c8d6a.png} +0 -0
  279. /kaa/sprites/{dd7bd6cd-90f1-4773-9b68-5df7f2f84da5.png → 4147514f-4f3f-4dd5-952b-0f2cf5f62181.png} +0 -0
  280. /kaa/sprites/{0562f69f-0300-4a2b-8252-63f3e7180e4c.png → 43e53b71-9d69-4f4f-b217-a1abeea8991e.png} +0 -0
  281. /kaa/sprites/{55c3af20-58dc-4407-a383-312a57417c39.png → 44fab632-3920-4cd8-9967-f7a8a1ee29a0.png} +0 -0
  282. /kaa/sprites/{645909d7-b960-46c7-b208-db44b6b7feec.png → 45f705f9-58fb-4729-ae55-ee10848678d6.png} +0 -0
  283. /kaa/sprites/{da48db0d-09d9-47c3-9e08-8b69ad547be6.png → 4678a5fa-5b1c-4fdc-b7c4-e0b820039546.png} +0 -0
  284. /kaa/sprites/{37215a56-f8e1-4f22-a148-9894136f6ab1.png → 4738974e-60b8-4583-8548-94211c164291.png} +0 -0
  285. /kaa/sprites/{338d7e71-98ce-4cd1-9954-bf7155150780.png → 474c1678-9c36-495b-aef2-cadbb47b237d.png} +0 -0
  286. /kaa/sprites/{01256311-237c-476f-96ce-4136dc4bfbd3.png → 47783412-9cc7-4ba0-904d-8cd300222889.png} +0 -0
  287. /kaa/sprites/{9f7150bc-c0b8-48d6-862c-456aaf518b2b.png → 47ed66a4-9e7e-4646-b554-469dc86322db.png} +0 -0
  288. /kaa/sprites/{5930140e-effe-4bcf-b0be-c20d3990d833.png → 4d0074ad-6db4-4060-b71a-05c0e36e57a6.png} +0 -0
  289. /kaa/sprites/{22dc4cfe-8c66-4461-8660-e2d11bbe6154.png → 4f2f8328-a698-40d3-a40f-1f1ae77dc843.png} +0 -0
  290. /kaa/sprites/{694879e8-ecca-45e2-8ea4-1b447fd43ace.png → 52d0ff68-7a55-4d53-bc20-a1fa05cfe876.png} +0 -0
  291. /kaa/sprites/{962aa0b9-1dd3-4260-a4fb-c069c26e5a84.png → 52d737a7-5b0b-4ce0-ae3f-5d4048060f12.png} +0 -0
  292. /kaa/sprites/{87f3c1ae-5117-4871-a7d6-3f5ff0c9f9fb.png → 54a9cae1-62e5-4546-a46a-a5157f51e8b4.png} +0 -0
  293. /kaa/sprites/{e7f2734f-9fdc-4521-8d7e-8b0fe270a223.png → 56d35e14-ada9-4bfa-a48f-e4601054e7eb.png} +0 -0
  294. /kaa/sprites/{3b4f90c9-6de7-4ac3-8e41-5f8757bf3f3e.png → 575784c1-7c4a-4484-9f38-aa3c280ce56e.png} +0 -0
  295. /kaa/sprites/{57c81080-7b53-4286-8fa5-848ad63e4774.png → 577417ee-6635-4cb4-9f28-d1e1b47ae2cd.png} +0 -0
  296. /kaa/sprites/{72634cb3-4c76-4ca2-8898-ebb837ec19e3.png → 58358122-984b-4c31-91d7-eaf5c8c9353d.png} +0 -0
  297. /kaa/sprites/{179c0fff-ebd2-4a16-8db2-297552cca218.png → 5a06a662-ffa9-49a9-a86d-136e5983abdd.png} +0 -0
  298. /kaa/sprites/{2b6d2eb0-bcf7-4bea-b037-6293d9c6d728.png → 5c8eebc5-6d5e-445e-a3d1-66dce2bb6338.png} +0 -0
  299. /kaa/sprites/{2a8626df-056c-46a2-aaf3-0060a5aef6a3.png → 5d2b03a2-acb6-4bd2-86e8-1b203d1aeaec.png} +0 -0
  300. /kaa/sprites/{0af1d573-1dc7-427e-997d-173308ea3649.png → 5f02656f-1314-44d0-ae31-a176c24d758c.png} +0 -0
  301. /kaa/sprites/{84cabff2-7a1b-4018-b74b-46f4db06304f.png → 608c12e2-95dd-4efa-93b2-e648e9583062.png} +0 -0
  302. /kaa/sprites/{8f7b55d8-0143-4d27-bef8-560d4d510500.png → 647bb09a-13f8-4d54-a8ac-5b534f1a8d87.png} +0 -0
  303. /kaa/sprites/{1cf03f98-63e9-467c-804d-c74dd97b69bd.png → 6483c406-26cc-44ee-ad12-2a30ec47aedb.png} +0 -0
  304. /kaa/sprites/{889a4153-b713-49cb-a4d5-e302bcdd002d.png → 67d6a201-dfb9-4c88-b42b-d968cf9a034c.png} +0 -0
  305. /kaa/sprites/{ea430652-e263-4a15-bb6f-8a8807be6c8f.png → 6a93b483-0848-45e4-a937-51850f296c3d.png} +0 -0
  306. /kaa/sprites/{e4dc3b35-195c-415f-9484-c2459bd8675a.png → 6b4e4351-b370-48cd-8e8f-ca663d44aa0c.png} +0 -0
  307. /kaa/sprites/{f6b042a8-a91e-4811-99f9-18bbb5197468.png → 6c961dee-87f3-42f1-acef-9fe7d6be4df1.png} +0 -0
  308. /kaa/sprites/{ab237c6d-c4d8-4716-8ef7-99b8e995c9a7.png → 6d22b7ee-6e0f-4f5d-96a4-d4cba26a4d04.png} +0 -0
  309. /kaa/sprites/{d7750f81-de10-4d6f-9cc7-35223bda9d70.png → 6d5a3e08-257c-4394-96a6-e0719a66e5ae.png} +0 -0
  310. /kaa/sprites/{847226a3-b7d2-4156-b732-9215a3e14f3a.png → 71d0d086-50f1-4f50-bb24-a0190827bd08.png} +0 -0
  311. /kaa/sprites/{2cec1d6a-9e8c-49b3-b885-0b0d7c4b95ee.png → 71f87e1c-77f1-45c7-bb9c-16f14498682b.png} +0 -0
  312. /kaa/sprites/{30e12bf1-8fa5-4de1-8d7b-28fa0fec0cb6.png → 737570a7-b8f9-4cd7-b5bd-f40cd51b49f8.png} +0 -0
  313. /kaa/sprites/{ae1e70bc-f735-4749-8c23-95735b91897a.png → 745ee069-0f22-4b99-9327-513f365eb922.png} +0 -0
  314. /kaa/sprites/{8bd22fe1-b544-4d2e-b74a-34f3cf0eb512.png → 7601152e-a216-4bf8-92a6-4e3e6ea01d3d.png} +0 -0
  315. /kaa/sprites/{bfdc9b53-2fe5-43f1-8588-7ab71217d31c.png → 7a23d548-4395-40cc-ac19-4497fa3d9fe2.png} +0 -0
  316. /kaa/sprites/{96704aa3-b5ad-4e34-bb88-fad766415362.png → 7a7871dd-fd07-4234-bd01-c3c9e41bad45.png} +0 -0
  317. /kaa/sprites/{43a367e1-91dd-495e-8c30-41903f75a99a.png → 7d3c3a12-8d0f-48a7-9fd4-66db5e58488f.png} +0 -0
  318. /kaa/sprites/{756f4ca7-acac-48e1-8bcd-1c5cd8937e3a.png → 7d9f8ea3-1fdf-4675-8ddf-38393e235746.png} +0 -0
  319. /kaa/sprites/{31e3ac2b-ecd4-4c37-88bc-985ef32e73a3.png → 83f258af-35b8-4918-a971-80ea938a854e.png} +0 -0
  320. /kaa/sprites/{91b30f5e-31b2-4756-a3f7-f0f82a335442.png → 848a6c94-97a5-44f7-b84b-2f3283dc446b.png} +0 -0
  321. /kaa/sprites/{8ed51be4-815c-4a3d-805e-030fdfa341e2.png → 86a56df9-47ff-4741-822d-5b7e024d1598.png} +0 -0
  322. /kaa/sprites/{f0462447-5226-4819-a39b-19ab90583f83.png → 8b04d1a8-6cd6-4d2e-91e7-bdc58c46d939.png} +0 -0
  323. /kaa/sprites/{4a081370-b0a1-4067-8470-e3007cc68a12.png → 8b60ce9f-09c0-48a0-93f0-d51e0aa16afb.png} +0 -0
  324. /kaa/sprites/{91a50322-52d9-4516-9e46-bc121f20667d.png → 8c59d3ca-baff-4260-aa0a-6cedac1c2771.png} +0 -0
  325. /kaa/sprites/{f635499a-943d-47da-952a-1feb58daa25b.png → 8d7b4761-2555-4398-bb74-b70de3b75e22.png} +0 -0
  326. /kaa/sprites/{13cb0309-b713-4725-b10b-26afe46eb9c0.png → 901a2e7a-37f3-4dda-a58b-5a7644ead6b9.png} +0 -0
  327. /kaa/sprites/{cd0e8663-2ea1-436a-b9fb-3caa0c3ed9e8.png → 9cc77f5e-e7d0-4de4-aeb8-587ab8cb212a.png} +0 -0
  328. /kaa/sprites/{9991b19c-7330-42c4-9d7d-db3cb00103b7.png → 9e45adeb-4637-4b8b-a687-f1d2cd8c6c18.png} +0 -0
  329. /kaa/sprites/{5734e48a-1e58-42de-be7b-b7db67db4a01.png → a006054e-61fb-4d2b-a98e-45ce3c663662.png} +0 -0
  330. /kaa/sprites/{d1ea0ea6-4a6a-4036-b140-922c95a648b5.png → a0f98517-e4cf-422c-b29f-395a55939772.png} +0 -0
  331. /kaa/sprites/{3aed50a2-d640-4178-9b8a-4dd7973eebf1.png → a94d76ef-db70-45a9-aeca-ba16344cc572.png} +0 -0
  332. /kaa/sprites/{978873bb-e4d0-451b-9126-6977144f5395.png → afe7f086-723e-4999-a7aa-3342a797d828.png} +0 -0
  333. /kaa/sprites/{dce410ee-fa56-41c4-b75e-e1bff79cd94f.png → b2036053-36fb-4aa7-8348-e31942731a93.png} +0 -0
  334. /kaa/sprites/{ad94041c-f30b-40b9-b11a-1a26e9962274.png → b6da02bf-3f43-4ed0-9b13-f15becb42ce9.png} +0 -0
  335. /kaa/sprites/{a5694c76-3c5d-462e-81d5-1e0e6cef0ec9.png → ba2fd21c-6228-4e2d-b2db-a6d085cb38a6.png} +0 -0
  336. /kaa/sprites/{cba0646d-dffe-4c5b-a44d-1f8d827624a6.png → bb224de8-828e-4bc5-a986-632c72fc9157.png} +0 -0
  337. /kaa/sprites/{5bf2a814-df85-4d0a-b4b5-8883ac2ee434.png → bcc6ee72-ad5a-4d5c-b6c7-1b3fdfc5fa81.png} +0 -0
  338. /kaa/sprites/{edcec31d-d5de-4f22-b666-3e3c656e06d8.png → bebf9f6d-7cca-44c5-9b9f-fa36e29e97b3.png} +0 -0
  339. /kaa/sprites/{9008fbb2-f23f-424f-9be7-5bae6a3697ab.png → c4d0b0c9-ffbe-4b6c-9bf3-b05919e1a07c.png} +0 -0
  340. /kaa/sprites/{f32a41a2-c482-41ba-b718-28f048f5148c.png → c893e762-f328-4ef6-b862-5da8eb049f9c.png} +0 -0
  341. /kaa/sprites/{2d0e9d49-365a-4bcb-a416-38b87defaa3c.png → c944d298-a46b-4799-aea3-eec22fc7d4ac.png} +0 -0
  342. /kaa/sprites/{5c310fe5-7e92-4167-9eba-6e8e14a2863a.png → d28a18db-0f66-45a6-b3cd-69173ecdd790.png} +0 -0
  343. /kaa/sprites/{464b1dd8-ca2e-41e9-a5b5-90545c584db7.png → d8d5019c-52e6-4767-a9aa-d8da6ffcbd00.png} +0 -0
  344. /kaa/sprites/{dd873ac0-ffba-4335-9cf2-2162c6835ed8.png → d9cb2f43-2786-48d8-90f8-8cf1929f6172.png} +0 -0
  345. /kaa/sprites/{e13fc34b-accc-4986-865d-f8d8410b45e9.png → dbc5db78-81f5-41e6-bdc4-dafaa9173320.png} +0 -0
  346. /kaa/sprites/{e9310e38-a418-4561-bf33-eb3e6dccf477.png → e2ac106f-edeb-4375-af8c-45f33e9bfae6.png} +0 -0
  347. /kaa/sprites/{d81b1325-e57a-4f22-93e1-6ad4baa28935.png → e8a33d3f-a4fb-4851-b47a-b5f3d85e882f.png} +0 -0
  348. /kaa/sprites/{2289d38f-dc98-4310-9f34-4cf5023f8545.png → f7facb3a-1b41-4409-b128-d4ad03245845.png} +0 -0
  349. {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/WHEEL +0 -0
  350. {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/entry_points.txt +0 -0
  351. {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/licenses/LICENSE +0 -0
  352. {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,208 @@
1
+ import logging
2
+ import os
3
+ import subprocess
4
+ import sys
5
+ import json
6
+ import zipfile
7
+ import threading
8
+ import time
9
+ from typing import Optional, List
10
+ from pydantic import BaseModel, Field
11
+
12
+ from kaa.errors import (
13
+ UpdateFetchListError, CompatibilityError, UpdateInstallError
14
+ )
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ class VersionInfo(BaseModel):
19
+ """存储版本信息的 Pydantic 模型"""
20
+ versions: List[str] = Field(default_factory=list)
21
+ latest: Optional[str] = None
22
+ installed_version: Optional[str] = None
23
+ launcher_version: Optional[str] = None
24
+
25
+ def _compare_versions(version1: str, version2: str) -> int:
26
+ """
27
+ 比较两个版本字符串。
28
+
29
+ :param version1: 第一个版本号
30
+ :param version2: 第二个版本号
31
+ :return: -1 表示 version1 < version2, 0 表示 version1 == version2, 1 表示 version1 > version2
32
+ """
33
+ if version1 == "0.4.x":
34
+ version1 = "0.4.0"
35
+
36
+ def parse(v):
37
+ v = v.lstrip('v')
38
+ parts = v.split('.')
39
+ base = []
40
+ pre_release = ''
41
+ for part in parts:
42
+ if 'b' in part:
43
+ base.append(int(part.split('b')[0]))
44
+ pre_release = ('b', int(part.split('b')[1]))
45
+ break
46
+ elif 'a' in part:
47
+ base.append(int(part.split('a')[0]))
48
+ pre_release = ('a', int(part.split('a')[1]))
49
+ break
50
+ elif 'rc' in part:
51
+ base.append(int(part.split('rc')[0]))
52
+ pre_release = ('rc', int(part.split('rc')[1]))
53
+ break
54
+ else:
55
+ base.append(int(part))
56
+
57
+ pre_map = {'a': -2, 'b': -1, 'rc': -0.5}
58
+ if pre_release:
59
+ return tuple(base) + (pre_map[pre_release[0]], pre_release[1])
60
+ return tuple(base) + (0, 0)
61
+
62
+ v1_parsed = parse(version1)
63
+ v2_parsed = parse(version2)
64
+
65
+ if v1_parsed < v2_parsed:
66
+ return -1
67
+ if v1_parsed > v2_parsed:
68
+ return 1
69
+ return 0
70
+
71
+ class UpdateService:
72
+ """处理应用程序更新逻辑"""
73
+
74
+ def __init__(self, repo_name: str = "ksaa"):
75
+ self.repo_name = repo_name
76
+ self.bootstrap_pyz_path = os.path.join(os.getcwd(), "bootstrap.pyz")
77
+
78
+ def _get_launcher_version(self) -> Optional[str]:
79
+ """
80
+ 从 bootstrap.pyz/meta.py 读取启动器版本。
81
+
82
+ :return: 启动器版本字符串,如果无法确定则返回 None。
83
+ """
84
+ if not os.path.exists(self.bootstrap_pyz_path):
85
+ logger.warning("bootstrap.pyz not found.")
86
+ return None
87
+
88
+ try:
89
+ with zipfile.ZipFile(self.bootstrap_pyz_path, 'r') as zf:
90
+ if 'meta.py' not in zf.namelist():
91
+ logger.warning("meta.py not found in bootstrap.pyz, assuming legacy launcher.")
92
+ return "0.4.x"
93
+
94
+ meta_content = zf.read('meta.py').decode('utf-8')
95
+ exec_globals = {}
96
+ exec_locals = {}
97
+ exec(meta_content, exec_globals, exec_locals)
98
+
99
+ version = exec_locals.get('VERSION')
100
+ if version and isinstance(version, str):
101
+ logger.info(f"Launcher version from meta.py: {version}")
102
+ return version.lstrip('v')
103
+ else:
104
+ logger.warning("VERSION not found in meta.py.")
105
+ return None
106
+ except zipfile.BadZipFile:
107
+ logger.info("bootstrap.pyz is not a valid zip file, assuming legacy launcher.")
108
+ return "0.4.x"
109
+ except Exception as e:
110
+ logger.error(f"Failed to read launcher version: {e}", exc_info=True)
111
+ return None
112
+
113
+ def list_remote_versions(self) -> VersionInfo:
114
+ """
115
+ 从 PyPI 获取可用版本。
116
+
117
+ :return: 包含版本数据的 VersionInfo 对象。
118
+ :raises UpdateFetchListError: 如果无法获取或解析版本列表。
119
+ """
120
+ cmd = [
121
+ sys.executable, "-m", "pip", "index", "versions", self.repo_name,
122
+ "--json", "--pre",
123
+ "--index-url", "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple",
124
+ "--trusted-host", "mirrors.tuna.tsinghua.edu.cn"
125
+ ]
126
+ logger.info(f"Executing: {' '.join(cmd)}")
127
+
128
+ try:
129
+ result = subprocess.run(
130
+ cmd,
131
+ capture_output=True,
132
+ text=True,
133
+ timeout=30,
134
+ check=False
135
+ )
136
+
137
+ if result.returncode != 0:
138
+ raise UpdateFetchListError(result.stderr)
139
+
140
+ data = json.loads(result.stdout)
141
+ version_info = VersionInfo(
142
+ versions=data.get("versions", []),
143
+ latest=data.get("latest"),
144
+ installed_version=data.get("installed_version")
145
+ )
146
+ version_info.launcher_version = self._get_launcher_version()
147
+ logger.info(f"Found {len(version_info.versions)} available versions.")
148
+ return version_info
149
+
150
+ except (subprocess.TimeoutExpired, json.JSONDecodeError, Exception) as e:
151
+ raise UpdateFetchListError(str(e)) from e
152
+
153
+ def _check_compatibility(self, target_version: str) -> Optional[str]:
154
+ """
155
+ 检查启动器是否与目标版本兼容。
156
+
157
+ :raises CompatibilityError: 如果启动器不兼容。
158
+ :return: 如果有潜在问题,则返回警告消息,否则返回 None。
159
+ """
160
+ launcher_version = self._get_launcher_version()
161
+ if not launcher_version:
162
+ return "无法获取启动器版本,可以继续安装但可能存在兼容性问题"
163
+
164
+ logger.info(f"Launcher version: {launcher_version}, Target version: {target_version}")
165
+
166
+ if _compare_versions(launcher_version, "0.5.0") < 0:
167
+ if _compare_versions(target_version, "2025.9b1") >= 0:
168
+ raise CompatibilityError(launcher_version, target_version)
169
+ else:
170
+ return "启动器版本较低,建议升级到 v0.5.0 以上"
171
+ return None
172
+
173
+ def install_version(self, version: str):
174
+ """
175
+ 安装应用程序的特定版本。
176
+
177
+ :param version: 要安装的版本。
178
+ :raises CompatibilityError: 如果启动器不兼容。
179
+ :raises UpdateInstallError: 如果安装过程启动失败。
180
+ """
181
+ if not version:
182
+ raise ValueError("A version must be selected to install.")
183
+
184
+ warning = self._check_compatibility(version)
185
+ if warning:
186
+ logger.warning(warning)
187
+
188
+ def _install_and_exit():
189
+ try:
190
+ time.sleep(1)
191
+ cmd = [sys.executable, self.bootstrap_pyz_path, f"--install-version={version}"]
192
+ logger.info(f"Starting installation via launcher: {' '.join(cmd)}")
193
+
194
+ subprocess.Popen(
195
+ cmd,
196
+ cwd=os.getcwd(),
197
+ creationflags=subprocess.CREATE_NEW_CONSOLE if os.name == 'nt' else 0
198
+ )
199
+ logger.info("Installation process started. Exiting current application.")
200
+ os._exit(0)
201
+ except Exception as e:
202
+ logger.critical(f"Failed to launch installation process: {e}", exc_info=True)
203
+
204
+ try:
205
+ install_thread = threading.Thread(target=_install_and_exit, daemon=True)
206
+ install_thread.start()
207
+ except Exception as e:
208
+ raise UpdateInstallError(str(e)) from e
File without changes
@@ -0,0 +1,123 @@
1
+ from typing import List, Dict, Tuple, Callable, Any, Literal, Optional
2
+ from dataclasses import dataclass, field
3
+ import gradio as gr
4
+ from kaa.config.schema import BaseConfig
5
+
6
+ # Type hints
7
+ GradioInput = gr.Textbox | gr.Number | gr.Checkbox | gr.Dropdown | gr.Radio | gr.Slider | gr.State
8
+ ConfigKey = Literal[
9
+ # backend
10
+ 'backend_type', 'adb_ip', 'adb_port',
11
+ 'screenshot_method', 'keep_screenshots',
12
+ 'check_emulator', 'emulator_path',
13
+ 'adb_emulator_name', 'emulator_args',
14
+ '_mumu_index', '_mumu12v5_index', '_leidian_index',
15
+ 'mumu_background_mode_v4', 'mumu_background_mode_v5', 'target_screenshot_interval',
16
+
17
+ # purchase
18
+ 'purchase_enabled',
19
+ 'money_enabled', 'ap_enabled',
20
+ 'ap_items', 'money_items', 'money_refresh',
21
+ 'weekly_enabled',
22
+
23
+ # assignment
24
+ 'assignment_enabled',
25
+ 'mini_live_reassign', 'mini_live_duration',
26
+ 'online_live_reassign', 'online_live_duration',
27
+ 'contest_enabled',
28
+ 'select_which_contestant', 'when_no_set',
29
+
30
+ # produce
31
+ 'produce_enabled', 'selected_solution_id', 'produce_count', 'produce_timeout_cd', 'interrupt_timeout', 'enable_fever_month',
32
+ 'mission_reward_enabled',
33
+
34
+ # club reward
35
+ 'club_reward_enabled',
36
+ 'selected_note',
37
+
38
+ # upgrade support card
39
+ 'upgrade_support_card_enabled',
40
+
41
+ # capsule toys
42
+ 'capsule_toys_enabled', 'friend_capsule_toys_count',
43
+ 'sense_capsule_toys_count', 'logic_capsule_toys_count',
44
+ 'anomaly_capsule_toys_count',
45
+
46
+ # start game
47
+ 'start_game_enabled', 'start_through_kuyo',
48
+ 'game_package_name', 'kuyo_package_name',
49
+ 'disable_gakumas_localify', 'dmm_game_path', 'dmm_bypass',
50
+
51
+ # end game
52
+ 'exit_kaa', 'kill_game', 'kill_dmm',
53
+ 'kill_emulator', 'shutdown', 'hibernate',
54
+ 'restore_gakumas_localify',
55
+
56
+ 'activity_funds',
57
+ 'presents',
58
+ 'mission_reward',
59
+ 'activity_funds_enabled',
60
+ 'presents_enabled',
61
+ 'trace_recommend_card_detection',
62
+
63
+ # misc
64
+ 'check_update', 'auto_install_update', 'expose_to_lan', 'update_channel', 'log_level',
65
+
66
+ # idle
67
+ 'idle_enabled', 'idle_seconds', 'idle_minimize_on_pause',
68
+
69
+ '_selected_backend_index'
70
+
71
+ ]
72
+ ConfigSetFunction = Callable[[BaseConfig, Dict[ConfigKey, Any]], None]
73
+ ConfigBuilderReturnValue = Tuple[ConfigSetFunction, Dict[ConfigKey, GradioInput]]
74
+
75
+
76
+ @dataclass
77
+ class GradioComponents:
78
+ """Dataclass to hold all Gradio UI components that need to be accessed across methods."""
79
+
80
+ # Main tabs
81
+ tabs: Optional[gr.Tabs] = None
82
+
83
+ # Status tab components
84
+ run_btn: Optional[gr.Button] = None
85
+ pause_btn: Optional[gr.Button] = None
86
+ end_action_dropdown: Optional[gr.Dropdown] = None
87
+ quick_checkboxes: List[gr.Checkbox] = field(default_factory=list)
88
+ task_runtime_text: Optional[gr.Textbox] = None
89
+ task_status_df: Optional[gr.Dataframe] = None
90
+
91
+ # Update tab components
92
+ update_info_md: Optional[gr.Markdown] = None
93
+ update_status_text: Optional[gr.Markdown] = None
94
+ update_version_dropdown: Optional[gr.Dropdown] = None
95
+ update_install_btn: Optional[gr.Button] = None
96
+
97
+ # Produce tab components
98
+ produce_tab_solution_dropdown: Optional[gr.Dropdown] = None
99
+ produce_solution_settings_group: Optional[gr.Group] = None
100
+ produce_solution_name: Optional[gr.Textbox] = None
101
+ produce_solution_description: Optional[gr.Textbox] = None
102
+ produce_mode: Optional[gr.Dropdown] = None
103
+ produce_idols: Optional[gr.Dropdown] = None
104
+ produce_auto_set_memory: Optional[gr.Checkbox] = None
105
+ produce_memory_sets_group: Optional[gr.Group] = None
106
+ produce_memory_sets: Optional[gr.Dropdown] = None
107
+ produce_auto_set_support: Optional[gr.Checkbox] = None
108
+ produce_support_card_sets_group: Optional[gr.Group] = None
109
+ produce_support_card_sets: Optional[gr.Dropdown] = None
110
+ produce_use_pt_boost: Optional[gr.Checkbox] = None
111
+ produce_use_note_boost: Optional[gr.Checkbox] = None
112
+ produce_follow_producer: Optional[gr.Checkbox] = None
113
+ produce_self_study_lesson: Optional[gr.Dropdown] = None
114
+ produce_prefer_lesson_ap: Optional[gr.Checkbox] = None
115
+ produce_actions_order: Optional[gr.Dropdown] = None
116
+ produce_recommend_card_detection_mode: Optional[gr.Dropdown] = None
117
+ produce_use_ap_drink: Optional[gr.Checkbox] = None
118
+ produce_skip_commu: Optional[gr.Checkbox] = None
119
+ produce_all_detail_components: List[Any] = field(default_factory=list)
120
+
121
+ # Settings tab components
122
+ settings_solution_dropdown: Optional[gr.Dropdown] = None
123
+ save_settings_btn: Optional[gr.Button] = None
@@ -0,0 +1,251 @@
1
+ from typing import Optional, Dict, Any
2
+
3
+ import gradio as gr
4
+
5
+ # 图标 SVG 定义
6
+ ICONS: Dict[str, str] = {
7
+ "success": """<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />""",
8
+ "info": """<path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd" />""",
9
+ "warning": """<path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd" />""",
10
+ "error": """<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />"""
11
+ }
12
+
13
+ class Alert(gr.HTML):
14
+ def __init__(
15
+ self,
16
+ value: str = "Alert Content",
17
+ title: Optional[str] = None,
18
+ variant: str = "info",
19
+ action_text: Optional[str] = None,
20
+ show_close: bool = True,
21
+ visible: bool = True,
22
+ elem_id: Optional[str] = None,
23
+ **kwargs: Any
24
+ ):
25
+ """
26
+ 继承自 gr.HTML 的自定义 Alert 组件。
27
+
28
+ Args:
29
+ value: Alert 的主要描述文本。
30
+ title: Alert 的标题(可选)。
31
+ variant: 样式变体,可选 "success", "info", "warning", "error"。
32
+ action_text: 底部操作按钮的文本(可选)。
33
+ show_close: 是否显示关闭按钮。
34
+ visible: 组件初始可见性。
35
+ elem_id: HTML 元素 ID。
36
+ **kwargs: 其他传递给 gr.HTML 的参数。
37
+ """
38
+
39
+ # 1. 样式模板 (CSS Template)
40
+ # 修改点:调整了布局,使 actions 包含在 content 内部以实现对齐
41
+ css = """
42
+ .alert {
43
+ display: flex;
44
+ align-items: flex-start; /* 顶部对齐 */
45
+ padding: 1rem;
46
+ border-radius: 0.5rem;
47
+ border: 1px solid transparent;
48
+ margin-bottom: 1rem;
49
+ transition: opacity 0.3s ease;
50
+ }
51
+
52
+ .alert-icon {
53
+ width: 1.25rem;
54
+ height: 1.25rem;
55
+ margin-right: 0.75rem;
56
+ flex-shrink: 0;
57
+ margin-top: 0.125rem; /* 微调图标与首行文字对齐 */
58
+ }
59
+
60
+ .alert-body-wrapper {
61
+ flex: 1;
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 0.25rem; /* 标题、描述、按钮之间的间距 */
65
+ }
66
+
67
+ .alert-title {
68
+ font-weight: 600;
69
+ font-size: 0.875rem;
70
+ }
71
+
72
+ .alert-description {
73
+ font-size: 0.875rem;
74
+ line-height: 1.25rem;
75
+ }
76
+
77
+ .alert-actions {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: 0.5rem;
81
+ margin-top: 0.25rem; /* 按钮与上方文字的额外间距 */
82
+ }
83
+
84
+ /* Variants Colors */
85
+ .alert-success { background-color: #ecfdf5; border-color: #a7f3d0; color: #065f46; }
86
+ .alert-success .alert-icon, .alert-success .action-btn { color: #059669; }
87
+
88
+ .alert-info { background-color: #eff6ff; border-color: #bfdbfe; color: #1e40af; }
89
+ .alert-info .alert-icon, .alert-info .action-btn { color: #2563eb; }
90
+
91
+ .alert-warning { background-color: #fffbeb; border-color: #fde68a; color: #92400e; }
92
+ .alert-warning .alert-icon, .alert-warning .action-btn { color: #d97706; }
93
+
94
+ .alert-error { background-color: #fef2f2; border-color: #fecaca; color: #991b1b; }
95
+ .alert-error .alert-icon, .alert-error .action-btn { color: #dc2626; }
96
+
97
+ /* Buttons */
98
+ .action-btn {
99
+ background: transparent;
100
+ border: none;
101
+ font-weight: 600;
102
+ cursor: pointer;
103
+ padding: 0; /* 移除 padding 以便像链接一样对齐,或者保留 padding 做成按钮样式 */
104
+ padding-right: 0.5rem;
105
+ font-size: 0.875rem;
106
+ text-align: left;
107
+ }
108
+ .action-btn:hover { text-decoration: underline; }
109
+
110
+ .close-btn {
111
+ background: transparent;
112
+ border: none;
113
+ cursor: pointer;
114
+ opacity: 0.6;
115
+ padding: 0.25rem;
116
+ margin-left: 0.75rem; /* 离内容稍微远一点 */
117
+ flex-shrink: 0;
118
+ display: flex;
119
+ }
120
+ .close-btn:hover { opacity: 1; }
121
+ .close-btn svg { width: 1rem; height: 1rem; }
122
+ """
123
+
124
+ # 2. HTML 模板 (HTML Template)
125
+ # 修改点:重构 HTML 结构,将 button 放入 .alert-body-wrapper 中
126
+ html_template = """
127
+ <div class="alert alert-${variant}" role="alert">
128
+ <svg class="alert-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
129
+ ${ {
130
+ 'success': `""" + ICONS['success'] + """`,
131
+ 'info': `""" + ICONS['info'] + """`,
132
+ 'warning': `""" + ICONS['warning'] + """`,
133
+ 'error': `""" + ICONS['error'] + """`
134
+ }[variant] }
135
+ </svg>
136
+
137
+ <div class="alert-body-wrapper">
138
+ ${ title ? `<div class="alert-title">${title}</div>` : '' }
139
+ <div class="alert-description">${value}</div>
140
+
141
+ ${ action_text ? `
142
+ <div class="alert-actions">
143
+ <button class="action-btn">${action_text}</button>
144
+ </div>` : '' }
145
+ </div>
146
+
147
+ ${ show_close ? `
148
+ <button class="close-btn" aria-label="Close">
149
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
150
+ <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd" />
151
+ </svg>
152
+ </button>` : '' }
153
+ </div>
154
+ """
155
+
156
+ # 3. JS 加载逻辑 (JS on Load)
157
+ js = """
158
+ const actionBtn = element.querySelector('.action-btn');
159
+ const closeBtn = element.querySelector('.close-btn');
160
+ const alertBox = element.querySelector('.alert');
161
+
162
+ if (actionBtn) {
163
+ actionBtn.addEventListener('click', (e) => {
164
+ e.stopPropagation(); // 防止冒泡
165
+ trigger('click', {
166
+ action_text: props.action_text,
167
+ variant: props.variant
168
+ });
169
+ });
170
+ }
171
+
172
+ if (closeBtn) {
173
+ closeBtn.addEventListener('click', (e) => {
174
+ e.stopPropagation();
175
+ alertBox.style.opacity = '0';
176
+ setTimeout(() => {
177
+ alertBox.style.display = 'none';
178
+ // 触发 change 事件通知后端状态变化
179
+ trigger('change', { status: 'closed' });
180
+ }, 300);
181
+ });
182
+ }
183
+ """
184
+
185
+ super().__init__(
186
+ value=value,
187
+ title=title,
188
+ variant=variant,
189
+ action_text=action_text,
190
+ show_close=show_close,
191
+ html_template=html_template,
192
+ css_template=css,
193
+ js_on_load=js,
194
+ visible=visible,
195
+ elem_id=elem_id,
196
+ **kwargs
197
+ )
198
+
199
+ # --- 使用示例 ---
200
+
201
+ if __name__ == "__main__":
202
+ with gr.Blocks() as demo:
203
+ gr.Markdown("### Alert Component with Typed Arguments & Aligned Layout")
204
+
205
+ with gr.Row():
206
+ with gr.Column():
207
+ # 控制器
208
+ msg_input = gr.Textbox(label="Alert Message", value="你似乎还没有创建任何培育方案。你需要先到「方案」里创建一个!")
209
+ title_input = gr.Textbox(label="Title", value="提示")
210
+ variant_input = gr.Dropdown(["success", "info", "warning", "error"], label="Variant", value="info")
211
+ action_input = gr.Textbox(label="Action Button Text", value="去创建")
212
+ update_btn = gr.Button("Update Alert")
213
+
214
+ with gr.Column():
215
+ # 组件实例化
216
+ alert = Alert(
217
+ title="提示",
218
+ value="你似乎还没有创建任何培育方案。你需要先到「方案」里创建一个!",
219
+ variant="info",
220
+ action_text="去创建",
221
+ elem_id="my-alert"
222
+ )
223
+
224
+ # 结果显示框
225
+ result_box = gr.Textbox(label="Event Log")
226
+
227
+ # 1. 更新 Alert 属性
228
+ def update_props(msg: str, title: str, variant: str, action: str) -> Alert:
229
+ return Alert(value=msg, title=title, variant=variant, action_text=action)
230
+
231
+ update_btn.click(
232
+ update_props,
233
+ inputs=[msg_input, title_input, variant_input, action_input],
234
+ outputs=alert
235
+ )
236
+
237
+ # 2. 处理 Action 按钮点击
238
+ def on_action_click(evt: gr.EventData) -> str:
239
+ data: Dict[str, Any] = evt._data # type: ignore
240
+ return f"Action Clicked! Variant: {data.get('variant')}, Action: {data.get('action_text')}"
241
+
242
+ alert.click(on_action_click, outputs=result_box)
243
+
244
+ # 3. 处理 Close 按钮点击
245
+ def on_close(evt: gr.EventData) -> str:
246
+ data: Dict[str, Any] = evt._data # type: ignore
247
+ return f"Alert Closed. Status: {data.get('status')}"
248
+
249
+ alert.change(on_close, outputs=result_box)
250
+
251
+ demo.launch()