pytron-kit 0.3.12__py3-none-macosx_11_0_universal2.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 (419) hide show
  1. pytron/__init__.py +112 -0
  2. pytron/application.py +562 -0
  3. pytron/apputils/__init__.py +0 -0
  4. pytron/apputils/chrome_ipc.py +203 -0
  5. pytron/apputils/codegen.py +261 -0
  6. pytron/apputils/config.py +303 -0
  7. pytron/apputils/deadmansswitch.py +47 -0
  8. pytron/apputils/extras.py +76 -0
  9. pytron/apputils/native.py +148 -0
  10. pytron/apputils/shell.py +73 -0
  11. pytron/apputils/windows.py +286 -0
  12. pytron/cli.py +384 -0
  13. pytron/commands/__init__.py +0 -0
  14. pytron/commands/android.py +28 -0
  15. pytron/commands/build.py +26 -0
  16. pytron/commands/doctor.py +221 -0
  17. pytron/commands/engine.py +23 -0
  18. pytron/commands/frontend.py +60 -0
  19. pytron/commands/harvest.py +112 -0
  20. pytron/commands/helpers.py +239 -0
  21. pytron/commands/info.py +50 -0
  22. pytron/commands/init.py +521 -0
  23. pytron/commands/install.py +294 -0
  24. pytron/commands/login.py +130 -0
  25. pytron/commands/package.py +228 -0
  26. pytron/commands/plugin.py +442 -0
  27. pytron/commands/run.py +312 -0
  28. pytron/commands/scan.py +210 -0
  29. pytron/commands/show.py +23 -0
  30. pytron/commands/uninstall.py +150 -0
  31. pytron/commands/utils.py +42 -0
  32. pytron/commands/workflow.py +95 -0
  33. pytron/console.py +133 -0
  34. pytron/core.py +18 -0
  35. pytron/dependencies/WebView2Loader.dll +0 -0
  36. pytron/dependencies/__init__.py +1 -0
  37. pytron/dependencies/pytron_native.so +0 -0
  38. pytron/engines/chrome/adapter.py +445 -0
  39. pytron/engines/chrome/engine.py +576 -0
  40. pytron/engines/chrome/forge.py +147 -0
  41. pytron/engines/chrome/shell/package.json +8 -0
  42. pytron/engines/chrome/shell/preload.js +12 -0
  43. pytron/engines/chrome/shell/shell.js +534 -0
  44. pytron/exceptions.py +36 -0
  45. pytron/inspector.py +201 -0
  46. pytron/inspector_ui.py +512 -0
  47. pytron/installer/Installation.nsi +236 -0
  48. pytron/installer/header.bmp +0 -0
  49. pytron/installer/pytron.ico +0 -0
  50. pytron/installer/sidebar.bmp +0 -0
  51. pytron/llms.md +98 -0
  52. pytron/manifests/README.md +29 -0
  53. pytron/manifests/windows-utf8.manifest +44 -0
  54. pytron/menu.py +128 -0
  55. pytron/nsis-setup.exe +0 -0
  56. pytron/pack/__init__.py +0 -0
  57. pytron/pack/assets.py +131 -0
  58. pytron/pack/compilers.py +289 -0
  59. pytron/pack/crystal.py +297 -0
  60. pytron/pack/graph.py +377 -0
  61. pytron/pack/inference.py +157 -0
  62. pytron/pack/installers.py +402 -0
  63. pytron/pack/introspect.py +357 -0
  64. pytron/pack/metadata.py +213 -0
  65. pytron/pack/modules.py +618 -0
  66. pytron/pack/nuitka.py +108 -0
  67. pytron/pack/pipeline.py +107 -0
  68. pytron/pack/pyinstaller.py +176 -0
  69. pytron/pack/rust_engine.py +273 -0
  70. pytron/pack/secure.py +309 -0
  71. pytron/pack/secure_loader/bin/pytron_rust_bootloader +0 -0
  72. pytron/pack/secure_loader/icon.ico +0 -0
  73. pytron/pack/utils.py +110 -0
  74. pytron/pack/virtual_root.py +124 -0
  75. pytron/platforms/__init__.py +0 -0
  76. pytron/platforms/android/__init__.py +3 -0
  77. pytron/platforms/android/android.py +103 -0
  78. pytron/platforms/android/builder.py +736 -0
  79. pytron/platforms/android/ops/build.py +79 -0
  80. pytron/platforms/android/ops/init.py +63 -0
  81. pytron/platforms/android/ops/run.py +79 -0
  82. pytron/platforms/android/ops/sync.py +770 -0
  83. pytron/platforms/android/ops/utils.py +8 -0
  84. pytron/platforms/android/shell/README.md +30 -0
  85. pytron/platforms/android/shell/app/build.gradle +64 -0
  86. pytron/platforms/android/shell/app/src/main/AndroidManifest.xml +29 -0
  87. pytron/platforms/android/shell/app/src/main/assets/python/main.py +86 -0
  88. pytron/platforms/android/shell/app/src/main/assets/python/python314.zip +0 -0
  89. pytron/platforms/android/shell/app/src/main/cpp/CMakeLists.txt +25 -0
  90. pytron/platforms/android/shell/app/src/main/cpp/include/Python.h +155 -0
  91. pytron/platforms/android/shell/app/src/main/cpp/include/abstract.h +915 -0
  92. pytron/platforms/android/shell/app/src/main/cpp/include/audit.h +30 -0
  93. pytron/platforms/android/shell/app/src/main/cpp/include/bltinmodule.h +14 -0
  94. pytron/platforms/android/shell/app/src/main/cpp/include/boolobject.h +54 -0
  95. pytron/platforms/android/shell/app/src/main/cpp/include/bytearrayobject.h +44 -0
  96. pytron/platforms/android/shell/app/src/main/cpp/include/bytesobject.h +66 -0
  97. pytron/platforms/android/shell/app/src/main/cpp/include/ceval.h +145 -0
  98. pytron/platforms/android/shell/app/src/main/cpp/include/codecs.h +176 -0
  99. pytron/platforms/android/shell/app/src/main/cpp/include/compile.h +22 -0
  100. pytron/platforms/android/shell/app/src/main/cpp/include/complexobject.h +30 -0
  101. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/abstract.h +104 -0
  102. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/audit.h +8 -0
  103. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/bytearrayobject.h +38 -0
  104. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/bytesobject.h +42 -0
  105. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/cellobject.h +50 -0
  106. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/ceval.h +43 -0
  107. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/classobject.h +71 -0
  108. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/code.h +340 -0
  109. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/compile.h +50 -0
  110. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/complexobject.h +33 -0
  111. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/context.h +107 -0
  112. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/critical_section.h +154 -0
  113. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/descrobject.h +62 -0
  114. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/dictobject.h +105 -0
  115. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/fileobject.h +16 -0
  116. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/fileutils.h +16 -0
  117. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/floatobject.h +27 -0
  118. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/frameobject.h +35 -0
  119. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/funcobject.h +185 -0
  120. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/genobject.h +56 -0
  121. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/import.h +30 -0
  122. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/initconfig.h +334 -0
  123. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/listobject.h +53 -0
  124. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/lock.h +74 -0
  125. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/longintrepr.h +184 -0
  126. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/longobject.h +89 -0
  127. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/memoryobject.h +50 -0
  128. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/methodobject.h +66 -0
  129. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/modsupport.h +26 -0
  130. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/monitoring.h +269 -0
  131. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/object.h +493 -0
  132. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/objimpl.h +104 -0
  133. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/odictobject.h +43 -0
  134. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/picklebufobject.h +31 -0
  135. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pthread_stubs.h +105 -0
  136. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyatomic.h +614 -0
  137. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyatomic_gcc.h +615 -0
  138. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyatomic_msc.h +1197 -0
  139. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyatomic_std.h +1112 -0
  140. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyctype.h +39 -0
  141. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pydebug.h +38 -0
  142. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyerrors.h +132 -0
  143. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyfpe.h +15 -0
  144. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyframe.h +45 -0
  145. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pyhash.h +54 -0
  146. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pylifecycle.h +89 -0
  147. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pymem.h +84 -0
  148. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pystate.h +275 -0
  149. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pystats.h +194 -0
  150. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pythonrun.h +96 -0
  151. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pythread.h +43 -0
  152. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/pytime.h +27 -0
  153. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/setobject.h +71 -0
  154. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/traceback.h +13 -0
  155. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/tracemalloc.h +32 -0
  156. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/tupleobject.h +40 -0
  157. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/unicodeobject.h +773 -0
  158. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/warnings.h +20 -0
  159. pytron/platforms/android/shell/app/src/main/cpp/include/cpython/weakrefobject.h +66 -0
  160. pytron/platforms/android/shell/app/src/main/cpp/include/critical_section.h +16 -0
  161. pytron/platforms/android/shell/app/src/main/cpp/include/datetime.h +267 -0
  162. pytron/platforms/android/shell/app/src/main/cpp/include/descrobject.h +100 -0
  163. pytron/platforms/android/shell/app/src/main/cpp/include/dictobject.h +108 -0
  164. pytron/platforms/android/shell/app/src/main/cpp/include/dynamic_annotations.h +499 -0
  165. pytron/platforms/android/shell/app/src/main/cpp/include/enumobject.h +17 -0
  166. pytron/platforms/android/shell/app/src/main/cpp/include/errcode.h +45 -0
  167. pytron/platforms/android/shell/app/src/main/cpp/include/exports.h +105 -0
  168. pytron/platforms/android/shell/app/src/main/cpp/include/fileobject.h +41 -0
  169. pytron/platforms/android/shell/app/src/main/cpp/include/fileutils.h +62 -0
  170. pytron/platforms/android/shell/app/src/main/cpp/include/floatobject.h +54 -0
  171. pytron/platforms/android/shell/app/src/main/cpp/include/frameobject.h +20 -0
  172. pytron/platforms/android/shell/app/src/main/cpp/include/genericaliasobject.h +14 -0
  173. pytron/platforms/android/shell/app/src/main/cpp/include/import.h +103 -0
  174. pytron/platforms/android/shell/app/src/main/cpp/include/internal/mimalloc/mimalloc/atomic.h +392 -0
  175. pytron/platforms/android/shell/app/src/main/cpp/include/internal/mimalloc/mimalloc/internal.h +969 -0
  176. pytron/platforms/android/shell/app/src/main/cpp/include/internal/mimalloc/mimalloc/prim.h +329 -0
  177. pytron/platforms/android/shell/app/src/main/cpp/include/internal/mimalloc/mimalloc/track.h +147 -0
  178. pytron/platforms/android/shell/app/src/main/cpp/include/internal/mimalloc/mimalloc/types.h +721 -0
  179. pytron/platforms/android/shell/app/src/main/cpp/include/internal/mimalloc/mimalloc.h +565 -0
  180. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_abstract.h +61 -0
  181. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_asdl.h +112 -0
  182. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_ast.h +945 -0
  183. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_ast_state.h +271 -0
  184. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_atexit.h +31 -0
  185. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_audit.h +35 -0
  186. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_backoff.h +133 -0
  187. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_bitutils.h +186 -0
  188. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_blocks_output_buffer.h +321 -0
  189. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_brc.h +73 -0
  190. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_bytes_methods.h +82 -0
  191. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_bytesobject.h +149 -0
  192. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_c_array.h +39 -0
  193. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_call.h +206 -0
  194. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_capsule.h +17 -0
  195. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_cell.h +75 -0
  196. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_ceval.h +390 -0
  197. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_ceval_state.h +48 -0
  198. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_code.h +671 -0
  199. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_codecs.h +76 -0
  200. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_compile.h +230 -0
  201. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_complexobject.h +34 -0
  202. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_condvar.h +93 -0
  203. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_context.h +59 -0
  204. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_critical_section.h +237 -0
  205. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_crossinterp.h +406 -0
  206. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_crossinterp_data_registry.h +41 -0
  207. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_debug_offsets.h +379 -0
  208. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_descrobject.h +28 -0
  209. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_dict.h +410 -0
  210. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_dict_state.h +28 -0
  211. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_dtoa.h +40 -0
  212. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_emscripten_signal.h +30 -0
  213. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_emscripten_trampoline.h +70 -0
  214. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_exceptions.h +40 -0
  215. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_faulthandler.h +100 -0
  216. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_fileutils.h +320 -0
  217. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_fileutils_windows.h +98 -0
  218. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_floatobject.h +49 -0
  219. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_flowgraph.h +47 -0
  220. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_format.h +27 -0
  221. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_frame.h +61 -0
  222. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_freelist.h +111 -0
  223. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_freelist_state.h +70 -0
  224. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_function.h +53 -0
  225. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_gc.h +378 -0
  226. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_genobject.h +43 -0
  227. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_getopt.h +22 -0
  228. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_gil.h +66 -0
  229. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_global_objects.h +34 -0
  230. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_global_objects_fini_generated.h +1592 -0
  231. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_global_strings.h +854 -0
  232. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_hamt.h +113 -0
  233. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_hashtable.h +150 -0
  234. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_import.h +141 -0
  235. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_importdl.h +139 -0
  236. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_index_pool.h +36 -0
  237. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_initconfig.h +197 -0
  238. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_instruction_sequence.h +83 -0
  239. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_instruments.h +127 -0
  240. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_interp.h +109 -0
  241. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_interp_structs.h +977 -0
  242. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_interpframe.h +401 -0
  243. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_interpframe_structs.h +95 -0
  244. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_interpolation.h +26 -0
  245. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_intrinsics.h +51 -0
  246. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_jit.h +29 -0
  247. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_list.h +81 -0
  248. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_llist.h +106 -0
  249. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_lock.h +236 -0
  250. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_long.h +319 -0
  251. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_magic_number.h +305 -0
  252. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_memoryobject.h +20 -0
  253. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_mimalloc.h +69 -0
  254. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_modsupport.h +99 -0
  255. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_moduleobject.h +62 -0
  256. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_namespace.h +21 -0
  257. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_object.h +1029 -0
  258. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_object_alloc.h +71 -0
  259. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_object_deferred.h +32 -0
  260. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_object_stack.h +95 -0
  261. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_object_state.h +49 -0
  262. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_obmalloc.h +702 -0
  263. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_obmalloc_init.h +66 -0
  264. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_opcode_metadata.h +2117 -0
  265. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_opcode_utils.h +90 -0
  266. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_optimizer.h +318 -0
  267. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_parking_lot.h +97 -0
  268. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_parser.h +78 -0
  269. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pathconfig.h +26 -0
  270. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pyarena.h +68 -0
  271. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pyatomic_ft_wrappers.h +174 -0
  272. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pybuffer.h +21 -0
  273. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pyerrors.h +213 -0
  274. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pyhash.h +91 -0
  275. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pylifecycle.h +136 -0
  276. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pymath.h +205 -0
  277. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pymem.h +145 -0
  278. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pymem_init.h +103 -0
  279. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pystate.h +339 -0
  280. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pystats.h +21 -0
  281. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pythonrun.h +68 -0
  282. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_pythread.h +172 -0
  283. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_qsbr.h +172 -0
  284. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_range.h +21 -0
  285. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_runtime.h +63 -0
  286. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_runtime_init.h +239 -0
  287. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_runtime_init_generated.h +1589 -0
  288. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_runtime_structs.h +310 -0
  289. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_semaphore.h +67 -0
  290. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_setobject.h +41 -0
  291. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_signal.h +108 -0
  292. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_sliceobject.h +20 -0
  293. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_stackref.h +791 -0
  294. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_stats.h +97 -0
  295. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_strhex.h +39 -0
  296. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_structs.h +88 -0
  297. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_structseq.h +40 -0
  298. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_symtable.h +201 -0
  299. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_sysmodule.h +32 -0
  300. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_template.h +26 -0
  301. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_time.h +334 -0
  302. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_token.h +110 -0
  303. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_traceback.h +111 -0
  304. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_tracemalloc.h +164 -0
  305. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_tstate.h +88 -0
  306. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_tuple.h +75 -0
  307. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_typedefs.h +18 -0
  308. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_typeobject.h +155 -0
  309. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_typevarobject.h +28 -0
  310. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_ucnhash.h +36 -0
  311. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_unicodeobject.h +308 -0
  312. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_unicodeobject_generated.h +3132 -0
  313. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_unionobject.h +26 -0
  314. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_uniqueid.h +57 -0
  315. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_uop_ids.h +335 -0
  316. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_uop_metadata.h +1204 -0
  317. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_warnings.h +21 -0
  318. pytron/platforms/android/shell/app/src/main/cpp/include/internal/pycore_weakref.h +133 -0
  319. pytron/platforms/android/shell/app/src/main/cpp/include/intrcheck.h +23 -0
  320. pytron/platforms/android/shell/app/src/main/cpp/include/iterobject.h +24 -0
  321. pytron/platforms/android/shell/app/src/main/cpp/include/listobject.h +55 -0
  322. pytron/platforms/android/shell/app/src/main/cpp/include/lock.h +16 -0
  323. pytron/platforms/android/shell/app/src/main/cpp/include/longobject.h +178 -0
  324. pytron/platforms/android/shell/app/src/main/cpp/include/marshal.h +31 -0
  325. pytron/platforms/android/shell/app/src/main/cpp/include/memoryobject.h +34 -0
  326. pytron/platforms/android/shell/app/src/main/cpp/include/methodobject.h +146 -0
  327. pytron/platforms/android/shell/app/src/main/cpp/include/modsupport.h +146 -0
  328. pytron/platforms/android/shell/app/src/main/cpp/include/moduleobject.h +122 -0
  329. pytron/platforms/android/shell/app/src/main/cpp/include/monitoring.h +18 -0
  330. pytron/platforms/android/shell/app/src/main/cpp/include/object.h +828 -0
  331. pytron/platforms/android/shell/app/src/main/cpp/include/objimpl.h +211 -0
  332. pytron/platforms/android/shell/app/src/main/cpp/include/opcode.h +43 -0
  333. pytron/platforms/android/shell/app/src/main/cpp/include/opcode_ids.h +259 -0
  334. pytron/platforms/android/shell/app/src/main/cpp/include/osdefs.h +57 -0
  335. pytron/platforms/android/shell/app/src/main/cpp/include/osmodule.h +17 -0
  336. pytron/platforms/android/shell/app/src/main/cpp/include/patchlevel.h +49 -0
  337. pytron/platforms/android/shell/app/src/main/cpp/include/py_curses.h +117 -0
  338. pytron/platforms/android/shell/app/src/main/cpp/include/pyatomic.h +16 -0
  339. pytron/platforms/android/shell/app/src/main/cpp/include/pybuffer.h +145 -0
  340. pytron/platforms/android/shell/app/src/main/cpp/include/pycapsule.h +58 -0
  341. pytron/platforms/android/shell/app/src/main/cpp/include/pyconfig.h +2088 -0
  342. pytron/platforms/android/shell/app/src/main/cpp/include/pydtrace.h +59 -0
  343. pytron/platforms/android/shell/app/src/main/cpp/include/pyerrors.h +335 -0
  344. pytron/platforms/android/shell/app/src/main/cpp/include/pyexpat.h +62 -0
  345. pytron/platforms/android/shell/app/src/main/cpp/include/pyframe.h +26 -0
  346. pytron/platforms/android/shell/app/src/main/cpp/include/pyhash.h +59 -0
  347. pytron/platforms/android/shell/app/src/main/cpp/include/pylifecycle.h +80 -0
  348. pytron/platforms/android/shell/app/src/main/cpp/include/pymacconfig.h +91 -0
  349. pytron/platforms/android/shell/app/src/main/cpp/include/pymacro.h +243 -0
  350. pytron/platforms/android/shell/app/src/main/cpp/include/pymath.h +65 -0
  351. pytron/platforms/android/shell/app/src/main/cpp/include/pymem.h +110 -0
  352. pytron/platforms/android/shell/app/src/main/cpp/include/pyport.h +710 -0
  353. pytron/platforms/android/shell/app/src/main/cpp/include/pystate.h +132 -0
  354. pytron/platforms/android/shell/app/src/main/cpp/include/pystats.h +28 -0
  355. pytron/platforms/android/shell/app/src/main/cpp/include/pystrcmp.h +23 -0
  356. pytron/platforms/android/shell/app/src/main/cpp/include/pystrtod.h +37 -0
  357. pytron/platforms/android/shell/app/src/main/cpp/include/pythonrun.h +42 -0
  358. pytron/platforms/android/shell/app/src/main/cpp/include/pythread.h +131 -0
  359. pytron/platforms/android/shell/app/src/main/cpp/include/pytypedefs.h +30 -0
  360. pytron/platforms/android/shell/app/src/main/cpp/include/rangeobject.h +27 -0
  361. pytron/platforms/android/shell/app/src/main/cpp/include/refcount.h +555 -0
  362. pytron/platforms/android/shell/app/src/main/cpp/include/setobject.h +49 -0
  363. pytron/platforms/android/shell/app/src/main/cpp/include/sliceobject.h +69 -0
  364. pytron/platforms/android/shell/app/src/main/cpp/include/structmember.h +56 -0
  365. pytron/platforms/android/shell/app/src/main/cpp/include/structseq.h +46 -0
  366. pytron/platforms/android/shell/app/src/main/cpp/include/sysmodule.h +27 -0
  367. pytron/platforms/android/shell/app/src/main/cpp/include/traceback.h +26 -0
  368. pytron/platforms/android/shell/app/src/main/cpp/include/tupleobject.h +46 -0
  369. pytron/platforms/android/shell/app/src/main/cpp/include/typeslots.h +96 -0
  370. pytron/platforms/android/shell/app/src/main/cpp/include/unicodeobject.h +1029 -0
  371. pytron/platforms/android/shell/app/src/main/cpp/include/warnings.h +45 -0
  372. pytron/platforms/android/shell/app/src/main/cpp/include/weakrefobject.h +46 -0
  373. pytron/platforms/android/shell/app/src/main/cpp/pytron_bridge.cpp +224 -0
  374. pytron/platforms/android/shell/app/src/main/java/com/pytron/shell/MainActivity.kt +208 -0
  375. pytron/platforms/android/shell/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  376. pytron/platforms/android/shell/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  377. pytron/platforms/android/shell/build.gradle +11 -0
  378. pytron/platforms/android/shell/gradle/wrapper/gradle-wrapper.jar +0 -0
  379. pytron/platforms/android/shell/gradle/wrapper/gradle-wrapper.properties +5 -0
  380. pytron/platforms/android/shell/gradle.properties +2 -0
  381. pytron/platforms/android/shell/gradlew.bat +85 -0
  382. pytron/platforms/android/shell/settings.gradle +16 -0
  383. pytron/platforms/darwin.py +82 -0
  384. pytron/platforms/darwin_ops/libs.py +31 -0
  385. pytron/platforms/darwin_ops/system.py +182 -0
  386. pytron/platforms/darwin_ops/utils.py +85 -0
  387. pytron/platforms/darwin_ops/webview.py +5 -0
  388. pytron/platforms/darwin_ops/window.py +102 -0
  389. pytron/platforms/interface.py +152 -0
  390. pytron/platforms/linux.py +82 -0
  391. pytron/platforms/linux_ops/libs.py +49 -0
  392. pytron/platforms/linux_ops/system.py +316 -0
  393. pytron/platforms/linux_ops/utils.py +19 -0
  394. pytron/platforms/linux_ops/webview.py +5 -0
  395. pytron/platforms/linux_ops/window.py +115 -0
  396. pytron/platforms/windows.py +136 -0
  397. pytron/platforms/windows_ops/__init__.py +0 -0
  398. pytron/platforms/windows_ops/constants.py +126 -0
  399. pytron/platforms/windows_ops/system.py +518 -0
  400. pytron/platforms/windows_ops/utils.py +3 -0
  401. pytron/platforms/windows_ops/webview.py +5 -0
  402. pytron/platforms/windows_ops/window.py +361 -0
  403. pytron/plugin.py +467 -0
  404. pytron/rcedit-x64.exe +0 -0
  405. pytron/router.py +146 -0
  406. pytron/serializer.py +240 -0
  407. pytron/shortcuts.py +279 -0
  408. pytron/state.py +76 -0
  409. pytron/tray.py +399 -0
  410. pytron/updater.py +181 -0
  411. pytron/utf8_hook.py +112 -0
  412. pytron/utils.py +44 -0
  413. pytron/webview.py +722 -0
  414. pytron_kit-0.3.12.dist-info/METADATA +131 -0
  415. pytron_kit-0.3.12.dist-info/RECORD +419 -0
  416. pytron_kit-0.3.12.dist-info/WHEEL +5 -0
  417. pytron_kit-0.3.12.dist-info/entry_points.txt +2 -0
  418. pytron_kit-0.3.12.dist-info/licenses/LICENSE +201 -0
  419. pytron_kit-0.3.12.dist-info/top_level.txt +1 -0
@@ -0,0 +1,534 @@
1
+ const { app, BrowserWindow, ipcMain, protocol, shell, session } = require('electron');
2
+ const path = require('path');
3
+ const net = require('net');
4
+ const fs = require('fs');
5
+
6
+ // Disable GPU if requested or for compatibility (user can toggle via flags if needed)
7
+ if (process.argv.includes('--disable-gpu')) {
8
+ app.disableHardwareAcceleration();
9
+ }
10
+
11
+ // 1. Register 'pytron' as a secure, standard scheme
12
+ protocol.registerSchemesAsPrivileged([
13
+ { scheme: 'pytron', privileges: { standard: true, secure: true, supportFetchAPI: true, corsEnabled: true, bypassCSP: true } }
14
+ ]);
15
+
16
+ // 16. Robust Synchronous Logging
17
+ const isDebug = process.argv.includes('--pytron-debug') || process.argv.includes('--inspect');
18
+
19
+ const log = (msg) => {
20
+ const stamped = `[Mojo-Shell][${new Date().toISOString()}] ${msg}`;
21
+ try {
22
+ // Prepare logs dir if needed, or just stdout
23
+ // fs.writeSync(1, stamped + "\n");
24
+ console.log(stamped);
25
+ } catch (e) {
26
+ // Silent catch for EPIPE (Broken Pipe) or other stdout issues during shutdown
27
+ }
28
+ };
29
+
30
+ log("--- MOJO SHELL BOOTING V7 (UNRESTRICTED) ---");
31
+
32
+ // Determine Root
33
+ const rootArg = process.argv.find(arg => arg.startsWith('--pytron-root='));
34
+ let PROJECT_ROOT = rootArg ? rootArg.split('=')[1] : null;
35
+ if (PROJECT_ROOT && PROJECT_ROOT.startsWith('"') && PROJECT_ROOT.endsWith('"')) {
36
+ PROJECT_ROOT = PROJECT_ROOT.substring(1, PROJECT_ROOT.length - 1);
37
+ }
38
+
39
+ // Helper for MIME types
40
+ function getMimeType(filename) {
41
+ if (filename.endsWith('.js')) return 'text/javascript';
42
+ if (filename.endsWith('.css')) return 'text/css';
43
+ if (filename.endsWith('.html')) return 'text/html';
44
+ if (filename.endsWith('.json')) return 'application/json';
45
+ if (filename.endsWith('.png')) return 'image/png';
46
+ if (filename.endsWith('.jpg') || filename.endsWith('.jpeg')) return 'image/jpeg';
47
+ if (filename.endsWith('.svg')) return 'image/svg+xml';
48
+ if (filename.endsWith('.webp')) return 'image/webp';
49
+ if (filename.endsWith('.ico')) return 'image/x-icon';
50
+ return 'application/octet-stream';
51
+ }
52
+
53
+ const WINDOW_CONFIG = {
54
+ show: false, // Wait until ready-to-show
55
+ width: 1024,
56
+ height: 768,
57
+ backgroundColor: '#ffffff',
58
+ webPreferences: {
59
+ nodeIntegration: false, // Pruned: No Node in renderer
60
+ contextIsolation: true, // Secure bridge
61
+ sandbox: false, // Unrestricted: Allow complex IPC/File access
62
+ webSecurity: false, // Unrestricted: CORS disabled, local files allowed
63
+ partition: 'persist:main', // Ditto like webview: Persist session
64
+ preload: path.join(__dirname, 'preload.js'),
65
+ devTools: true
66
+ }
67
+ };
68
+
69
+ let mainWindow;
70
+ let clientIn = null; // We Read
71
+ let clientOut = null; // We Write
72
+ let client = null; // Legacy TCP or Unix Socket
73
+ let buffer = Buffer.alloc(0);
74
+ let initScripts = [];
75
+ let isAppReady = false;
76
+ let pendingCommands = [];
77
+
78
+ function connectToPytron() {
79
+ const portArg = process.argv.find(arg => arg.startsWith('--pytron-port='));
80
+ const pipeArg = process.argv.find(arg => arg.startsWith('--pytron-pipe='));
81
+
82
+ if (pipeArg) {
83
+ const pipeBase = pipeArg.split('=')[1];
84
+
85
+ // Check if Windows (via path format)
86
+ if (pipeBase.startsWith('\\\\.\\pipe\\')) {
87
+ log(`Connecting to Dual Pipe IPC: ${pipeBase}`);
88
+
89
+ // 1. Connect INBOUND (We Read, Python Writes)
90
+ clientIn = new net.Socket();
91
+ // 2. Connect OUTBOUND (We Write, Python Reads)
92
+ clientOut = new net.Socket();
93
+
94
+ let connectedCount = 0;
95
+ const checkReady = () => {
96
+ connectedCount++;
97
+ if (connectedCount === 2) {
98
+ log("✅ Connected to Pytron Core (Dual Pipe). Sending Handshake...");
99
+ sendToPython('lifecycle', 'app_ready');
100
+ }
101
+ };
102
+
103
+ clientIn.connect(pipeBase + '-in', () => {
104
+ log("Connected to Pipe-IN (Reading)");
105
+ checkReady();
106
+ });
107
+
108
+ clientOut.connect(pipeBase + '-out', () => {
109
+ log("Connected to Pipe-OUT (Writing)");
110
+ checkReady();
111
+ });
112
+
113
+ // Setup Reader on clientIn
114
+ clientIn.on('data', (chunk) => {
115
+ buffer = Buffer.concat([buffer, chunk]);
116
+ while (buffer.length >= 4) {
117
+ const msgLen = buffer.readUInt32LE(0);
118
+ if (buffer.length >= 4 + msgLen) {
119
+ const bodyBytes = buffer.slice(4, 4 + msgLen);
120
+ const bodyString = bodyBytes.toString('utf-8');
121
+ handlePythonCommand(bodyString);
122
+ buffer = buffer.slice(4 + msgLen);
123
+ } else {
124
+ break;
125
+ }
126
+ }
127
+ });
128
+
129
+ clientIn.on('error', (err) => log(`Pipe-IN Error: ${err.message}`));
130
+ clientOut.on('error', (err) => log(`Pipe-OUT Error: ${err.message} (Code: ${err.code})`));
131
+
132
+ clientIn.on('end', () => log("Pipe-IN Received FIN (End)"));
133
+ clientOut.on('end', () => log("Pipe-OUT Received FIN (End)"));
134
+
135
+ clientIn.on('close', (hadError) => {
136
+ log(`Pipe-IN Closed. Had Error: ${hadError}`);
137
+ app.quit();
138
+ });
139
+ clientOut.on('close', (hadError) => {
140
+ log(`Pipe-OUT Closed. Had Error: ${hadError}`);
141
+ });
142
+
143
+ } else {
144
+ // Unix Socket (Single)
145
+ log(`Connecting to Unix Socket: ${pipeBase}`);
146
+ client = new net.Socket();
147
+ client.connect(pipeBase, () => {
148
+ log("✅ Connected to Pytron Core (Unix Socket). Sending Handshake...");
149
+ sendToPython('lifecycle', 'app_ready');
150
+ });
151
+ setupClientListeners(client);
152
+ }
153
+
154
+ } else if (portArg) {
155
+ // TCP Fallback
156
+ const port = parseInt(portArg.split('=')[1]);
157
+ log(`Connecting to Python on port: ${port}`);
158
+
159
+ client = new net.Socket();
160
+ client.connect(port, '127.0.0.1', () => {
161
+ log("✅ Connected to Pytron Core (TCP). Sending Handshake...");
162
+ sendToPython('lifecycle', 'app_ready');
163
+ });
164
+ setupClientListeners(client);
165
+ } else {
166
+ log("FATAL: No --pytron-port or --pytron-pipe provided");
167
+ return;
168
+ }
169
+ }
170
+
171
+ function setupClientListeners(socket) {
172
+ socket.on('data', (chunk) => {
173
+ buffer = Buffer.concat([buffer, chunk]);
174
+ while (buffer.length >= 4) {
175
+ const msgLen = buffer.readUInt32LE(0);
176
+ if (buffer.length >= 4 + msgLen) {
177
+ const bodyBytes = buffer.slice(4, 4 + msgLen);
178
+ const bodyString = bodyBytes.toString('utf-8');
179
+ handlePythonCommand(bodyString);
180
+ buffer = buffer.slice(4 + msgLen);
181
+ } else {
182
+ break;
183
+ }
184
+ }
185
+ });
186
+ socket.on('error', (err) => log(`Socket Error: ${err.message}`));
187
+ socket.on('close', () => {
188
+ log("Socket Closed. Exiting.");
189
+ app.quit();
190
+ });
191
+ }
192
+
193
+ function sendToPython(type, payload) {
194
+ const target = clientOut || client;
195
+
196
+ if (target && !target.destroyed) {
197
+ try {
198
+ const bodyStr = JSON.stringify({ type, payload });
199
+ const bodyBuf = Buffer.from(bodyStr, 'utf8');
200
+ const headerBuf = Buffer.alloc(4);
201
+ headerBuf.writeUInt32LE(bodyBuf.length, 0);
202
+ target.write(Buffer.concat([headerBuf, bodyBuf]));
203
+ } catch (e) {
204
+ log(`Send Error: ${e.message}`);
205
+ }
206
+ }
207
+ }
208
+
209
+ function handlePythonCommand(cmd) {
210
+ if (isDebug) log(`Executing: ${cmd.substring(0, 100)}...`);
211
+
212
+ if (!isAppReady) {
213
+ log("Queueing command (App not ready)");
214
+ pendingCommands.push(cmd);
215
+ return;
216
+ }
217
+
218
+ try {
219
+ const command = JSON.parse(cmd);
220
+ switch (command.action) {
221
+ case 'init':
222
+ if (command.options && command.options.root) {
223
+ PROJECT_ROOT = command.options.root;
224
+ log(`Updating PROJECT_ROOT to: ${PROJECT_ROOT}`);
225
+ }
226
+ createWindow(command.options);
227
+ break;
228
+ case 'init_script':
229
+ initScripts.push(command.js);
230
+ if (mainWindow) mainWindow.webContents.executeJavaScript(command.js).catch(e => log(`Init Err: ${e.message}`));
231
+ break;
232
+ case 'navigate':
233
+ if (mainWindow) {
234
+ log(`Navigating to: ${command.url}`);
235
+ mainWindow.loadURL(command.url);
236
+ }
237
+ break;
238
+ case 'eval':
239
+ if (mainWindow) mainWindow.webContents.executeJavaScript(command.code).catch(e => log(`Eval Err: ${e.message}`)); // nosemgrep
240
+ break;
241
+ case 'set_title':
242
+ if (mainWindow) mainWindow.setTitle(command.title);
243
+ break;
244
+ case 'set_size':
245
+ if (mainWindow) {
246
+ mainWindow.setSize(command.width, command.height);
247
+ mainWindow.show();
248
+ }
249
+ break;
250
+ case 'center':
251
+ if (mainWindow) mainWindow.center();
252
+ break;
253
+ case 'minimize':
254
+ if (mainWindow) mainWindow.minimize();
255
+ break;
256
+ case 'toggle_maximize':
257
+ if (mainWindow) {
258
+ if (mainWindow.isMaximized()) mainWindow.unmaximize();
259
+ else mainWindow.maximize();
260
+ }
261
+ break;
262
+ case 'set_frameless':
263
+ // Can't change frameless dynamically easily in Electron without recreation
264
+ break;
265
+ case 'set_progress':
266
+ // command.value: 0.0 to 1.0. -1 to remove.
267
+ // command.mode: 'none', 'normal', 'indeterminate', 'error', 'paused'
268
+ if (mainWindow) {
269
+ const val = command.value !== undefined ? command.value : -1;
270
+ const mode = command.mode || 'normal';
271
+ mainWindow.setProgressBar(val, { mode: mode });
272
+ }
273
+ break;
274
+ case 'show':
275
+ if (mainWindow) {
276
+ log("Force Show command received");
277
+ mainWindow.show();
278
+ mainWindow.focus();
279
+ } else {
280
+ log("Received Show command but mainWindow is NULL");
281
+ }
282
+ break;
283
+ case 'hide': if (mainWindow) mainWindow.hide(); break;
284
+ case 'bind':
285
+ const stub = `
286
+ window["${command.name}"] = (...args) => {
287
+ const seq = Math.random().toString(36).substr(2, 9);
288
+ return new Promise((resolve, reject) => {
289
+ window._pytron_promises = window._pytron_promises || {};
290
+ window._pytron_promises[seq] = { resolve, reject };
291
+ if (window.__pytron_native_bridge) {
292
+ window.__pytron_native_bridge.emit("${command.name}", { data: args, id: seq });
293
+ } else if (window.pytron && window.pytron.emit) {
294
+ window.pytron.emit("${command.name}", { data: args, id: seq });
295
+ }
296
+ });
297
+ };
298
+ `;
299
+ initScripts.push(stub);
300
+ if (mainWindow) mainWindow.webContents.executeJavaScript(stub).catch(() => { });
301
+ break;
302
+ case 'reply':
303
+ if (mainWindow) {
304
+ const js = `
305
+ if (window._pytron_promises && window._pytron_promises["${command.id}"]) {
306
+ const p = window._pytron_promises["${command.id}"];
307
+ if (${command.status} === 0) p.resolve(${JSON.stringify(command.result)});
308
+ else p.reject(${JSON.stringify(command.result)});
309
+ delete window._pytron_promises["${command.id}"];
310
+ }
311
+ `;
312
+ mainWindow.webContents.executeJavaScript(js).catch(() => { });
313
+ }
314
+ break;
315
+ case 'close': app.quit(); break;
316
+ case 'serve_data':
317
+ // command: { action: 'serve_data', key: '...', data: 'BASE64...', mime: '...' }
318
+ if (global.serveAsset) {
319
+ global.serveAsset(command.key, command.data, command.mime);
320
+ }
321
+ break;
322
+ case 'unserve_data':
323
+ if (global.unserveAsset) {
324
+ global.unserveAsset(command.key);
325
+ }
326
+ break;
327
+ case 'debugger':
328
+ try {
329
+ // Evaluate JS on the main process if needed
330
+ eval(command.code); // nosemgrep
331
+ } catch (e) { log(`Debugger Error: ${e.message}`); }
332
+ break;
333
+ }
334
+ } catch (e) { log(`Execution Error: ${e.message}`); }
335
+ }
336
+
337
+ async function createWindow(options = {}) {
338
+ if (mainWindow) return;
339
+
340
+ log("Creating BrowserWindow...");
341
+ const config = { ...WINDOW_CONFIG, ...options };
342
+
343
+ // Icon (Resolve absolute path if provided)
344
+ if (options.icon) {
345
+ config.icon = options.icon; // Electron handles absolute paths fine
346
+ }
347
+
348
+ // Enhanced Window Configuration
349
+ config.resizable = options.resizable !== undefined ? !!options.resizable : true;
350
+ config.alwaysOnTop = !!options.always_on_top;
351
+ config.fullscreen = !!options.fullscreen;
352
+
353
+ if (options.min_size) {
354
+ config.minWidth = options.min_size[0];
355
+ config.minHeight = options.min_size[1];
356
+ }
357
+ if (options.max_size) {
358
+ config.maxWidth = options.max_size[0];
359
+ config.maxHeight = options.max_size[1];
360
+ }
361
+ if (options.background_color) {
362
+ config.backgroundColor = options.background_color;
363
+ }
364
+
365
+ // Transparent
366
+ if (options.transparent) {
367
+ config.transparent = true;
368
+ }
369
+
370
+ // Robust Frameless with Snapping (Windows-first logic)
371
+ if (options.frameless) {
372
+ config.frame = false;
373
+ // On macOS/Windows, 'hidden' allows the OS to still handle snapping/resize margins
374
+ // while the titlebar stays invisible.
375
+ config.titleBarStyle = 'hidden';
376
+ }
377
+
378
+ config.show = false; // Always start false, show on ready
379
+
380
+ mainWindow = new BrowserWindow(config);
381
+
382
+ // SEND HWND TO PYTHON (Critical for Taskbar/Native Ops)
383
+ try {
384
+ const handle = mainWindow.getNativeWindowHandle();
385
+ let hwndStr = "0";
386
+ if (handle.length === 8) {
387
+ hwndStr = handle.readBigUInt64LE(0).toString();
388
+ } else if (handle.length === 4) {
389
+ hwndStr = handle.readUInt32LE(0).toString();
390
+ }
391
+ sendToPython('lifecycle', { event: 'window_created', hwnd: hwndStr });
392
+ } catch (e) {
393
+ log(`HWND Error: ${e.message}`);
394
+ }
395
+
396
+ // Simple Pruned Webview: Remove Menu
397
+ mainWindow.setMenu(null);
398
+
399
+ // External Links: Open in Default Browser (Maintain "Application" vibe)
400
+ mainWindow.webContents.on('will-navigate', (event, url) => {
401
+ if (!url.startsWith('pytron://') && !url.startsWith('https://pytron.') && url !== 'about:blank') {
402
+ event.preventDefault();
403
+ shell.openExternal(url);
404
+ }
405
+ });
406
+
407
+ mainWindow.webContents.setWindowOpenHandler(({ url }) => {
408
+ if (!url.startsWith('pytron://') && !url.startsWith('https://pytron.') && url !== 'about:blank') {
409
+ shell.openExternal(url);
410
+ return { action: 'deny' };
411
+ }
412
+ return { action: 'allow' };
413
+ });
414
+
415
+ if (config.debug) mainWindow.webContents.openDevTools();
416
+ if (config.url) mainWindow.loadURL(config.url);
417
+
418
+ mainWindow.once('ready-to-show', () => {
419
+ log("Event: ready-to-show. Processing start state.");
420
+ applyInitScripts();
421
+ sendToPython('lifecycle', 'ready');
422
+
423
+ if (options.start_hidden) {
424
+ log("Starting Hidden");
425
+ return;
426
+ }
427
+
428
+ if (options.start_minimized) {
429
+ mainWindow.minimize();
430
+ return;
431
+ }
432
+
433
+ if (options.start_maximized) {
434
+ mainWindow.maximize();
435
+ } else {
436
+ mainWindow.show();
437
+ mainWindow.focus();
438
+ }
439
+ });
440
+
441
+ mainWindow.on('close', () => sendToPython('lifecycle', 'close'));
442
+ ipcMain.on('pytron-message', (event, arg) => sendToPython('ipc', arg));
443
+ }
444
+
445
+ function applyInitScripts() {
446
+ if (!mainWindow) return;
447
+ initScripts.forEach(js => {
448
+ mainWindow.webContents.executeJavaScript(js).catch(() => { });
449
+ });
450
+ }
451
+
452
+ const gotTheLock = app.requestSingleInstanceLock()
453
+ if (!gotTheLock) {
454
+ app.quit()
455
+ } else {
456
+ app.whenReady().then(() => {
457
+ log("Electron Ready");
458
+
459
+ // 2. Intercept requests to pytron://
460
+ // We register the handler on the SPECIFIC session partition used by the window.
461
+ // The global 'protocol' module only affects session.defaultSession.
462
+ const servedData = new Map();
463
+
464
+ // Export internal serve function for IPC usage
465
+ global.serveAsset = (key, dataBase64, mimeType) => {
466
+ const buffer = Buffer.from(dataBase64, 'base64');
467
+ servedData.set(key, { buffer, mimeType });
468
+ log(`[Protocol] Memory Asset Served: ${key} (${mimeType})`);
469
+ };
470
+
471
+ global.unserveAsset = (key) => {
472
+ if (servedData.has(key)) {
473
+ servedData.delete(key);
474
+ log(`[Protocol] Memory Asset Removed: ${key}`);
475
+ }
476
+ };
477
+
478
+ const handler = (request) => {
479
+ let urlPath = request.url.replace('pytron://', '');
480
+ urlPath = urlPath.split('?')[0];
481
+
482
+ // 1. Check Memory Store (O(1) Lookup for Dynamic Assets)
483
+ if (servedData.has(urlPath)) {
484
+ const asset = servedData.get(urlPath);
485
+ return new Response(asset.buffer, {
486
+ headers: { 'content-type': asset.mimeType }
487
+ });
488
+ }
489
+
490
+ // 2. Fallback to Disk (Project Root)
491
+ if (!PROJECT_ROOT) {
492
+ return new Response("Project Root Not Set", { status: 500 });
493
+ }
494
+
495
+ // Normalize urlPath: Remove leading 'app/' or '/'
496
+ let normalizedPath = urlPath;
497
+ if (normalizedPath.startsWith('app/')) {
498
+ normalizedPath = normalizedPath.substring(4);
499
+ } else if (normalizedPath.startsWith('/')) {
500
+ normalizedPath = normalizedPath.substring(1);
501
+ }
502
+
503
+ let filePath = path.join(PROJECT_ROOT, normalizedPath);
504
+ // log(`[Protocol] Request: ${request.url} -> ${filePath}`);
505
+
506
+ try {
507
+ if (fs.existsSync(filePath) && fs.lstatSync(filePath).isFile()) {
508
+ const data = fs.readFileSync(filePath);
509
+ return new Response(data, {
510
+ headers: { 'content-type': getMimeType(filePath) }
511
+ });
512
+ }
513
+ // log(`[Protocol] File Not Found: ${filePath}`);
514
+ return new Response("Not Found", { status: 404 });
515
+ } catch (e) {
516
+ log(`[Protocol] Error serving ${urlPath}: ${e.message}`);
517
+ return new Response("Internal Error", { status: 500 });
518
+ }
519
+ };
520
+
521
+ protocol.handle('pytron', handler);
522
+ session.fromPartition('persist:main').protocol.handle('pytron', handler);
523
+
524
+ isAppReady = true;
525
+ while (pendingCommands.length > 0) {
526
+ handlePythonCommand(pendingCommands.shift());
527
+ }
528
+ });
529
+ }
530
+
531
+ app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit(); });
532
+
533
+ // Start the client
534
+ connectToPytron();
pytron/exceptions.py ADDED
@@ -0,0 +1,36 @@
1
+ class PytronError(Exception):
2
+ """Base class for all Pytron exceptions."""
3
+
4
+ def __init__(self, message, code=None):
5
+ super().__init__(message)
6
+ self.code = code
7
+
8
+
9
+ class ConfigError(PytronError):
10
+ """Raised when there is an error loading or parsing configuration."""
11
+
12
+ pass
13
+
14
+
15
+ class PlatformError(PytronError):
16
+ """Raised when there is a platform-specific issue (e.g. unsupported OS)."""
17
+
18
+ pass
19
+
20
+
21
+ class ResourceNotFoundError(PytronError, FileNotFoundError):
22
+ """Raised when a required resource (HTML file, icon, etc.) is not found."""
23
+
24
+ pass
25
+
26
+
27
+ class BridgeError(PytronError):
28
+ """Raised when there is an error in the Python-JS bridge communication."""
29
+
30
+ pass
31
+
32
+
33
+ class DependencyError(PytronError):
34
+ """Raised when a required dependency is missing."""
35
+
36
+ pass